UPDATE med Join

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

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