In my previous blog post, I covered some issues with incorrect statistics and in this…
Det kan ibland upplevas svårt att skriva en update med join. Ett sätt att göra det på är att börja med en select för att leta ut de rader man ska uppdatera.
Exempel om man i Adventureworks2012 vill öka priserna på ”Accessories” med undergruppen ” Tires and Tubes” med 5% skulle selecten kunna se ut så här:
SELECT PC.Name, P.Name, P.ListPrice, Round(P.ListPrice*1.05,2) as [Nytt Pris]
FROM Production.Product P
INNER JOIN Production.ProductSubcategory PS
ON P.ProductSubcategoryID = PS.ProductSubcategoryID
INNER JOIN Production.ProductCategory PC
ON PS.ProductCategoryID = PC.ProductCategoryID
WHERE PC.Name = ‘Accessories’ and PS.Name = ‘Tires and Tubes’
Det är då dessa rader som skulle påverkas.
Name Name ListPrice Nytt Pris
Accessories Patch Kit/8 Patches 2,29 2.400000
Accessories Mountain Tire Tube 4,99 5.240000
Accessories Road Tire Tube 3,99 4.190000
Accessories Touring Tire Tube 4,99 5.240000
Accessories LL Mountain Tire 24,99 26.240000
Accessories ML Mountain Tire 29,99 31.490000
Accessories HL Mountain Tire 35,00 36.750000
Accessories LL Road Tire 21,49 22.560000
Accessories ML Road Tire 24,99 26.240000
Accessories HL Road Tire 32,60 34.230000
Accessories Touring Tire 28,99 30.440000
När man är säker på att det är rätt rader I resultatet justerar man SQL:en genom att byta ut Select mot Update så här:
UPDATE P SET P.ListPrice = Round(P.ListPrice*1.05,2)
FROM Production.Product P
INNER JOIN Production.ProductSubcategory PS
ON P.ProductSubcategoryID = PS.ProductSubcategoryID
INNER JOIN Production.ProductCategory PC
ON PS.ProductCategoryID = PC.ProductCategoryID
WHERE PC.Name = ‘Accessories’ and PS.Name = ‘Tires and Tubes’
Istället för att skriva ”UPDATE tabellnamn” som man ofta gör så skriver man ”UPDATE alias” och hänvisar till det tabell alias som har använts i FROM. Updatering kan självklart bara göras i en tabell i taget men man kan använda data från alla tabeller som finns med i FROM för att skapa uppdateringvärdet.
Så här blev resultatet av updaten dvs så som vi redan såg i selecten ovan.
Name Name ListPrice
Accessories Patch Kit/8 Patches 2,40
Accessories Mountain Tire Tube 5,24
Accessories Road Tire Tube 4,19
Accessories Touring Tire Tube 5,24
Accessories LL Mountain Tire 26,24
Accessories ML Mountain Tire 31,49
Accessories HL Mountain Tire 36,75
Accessories LL Road Tire 22,56
Accessories ML Road Tire 26,24
Accessories HL Road Tire 34,23
Accessories Touring Tire 30,44