sql >> Database teknologi >  >> RDS >> Oracle

5 måder at opdatere data med en underforespørgsel i Oracle SQL

En underforespørgsel er en effektiv måde at finde de data, du vil bruge til en anden forespørgsel. De bruges ofte i SELECT- og UPDATE-sætninger for at gøre disse forespørgsler mere effektive og nemmere at vedligeholde.

Der er flere forskellige måder at bruge underforespørgsler i UPDATE-sætninger. Lad os tage et kig på hver af dem.

SET og underforespørgsel

Den første metode, vi vil se på, er at bruge en underforespørgsel i SET-sætningen i en UPDATE-sætning.

Lad os sige, at vi havde en tabel med produkter, der så sådan ud:

[tabel id=29 /]

Den gemmer nogle få oplysninger om forskellige produkter, som en virksomhed sælger.

Antag, at virksomheden besluttede at forhøje prisen på "Couch"-produktet (produkt-id 1). Men i stedet for at sætte en bestemt pris, ønsker de at gøre den 20 % højere end det dyreste produkt, de har.

For at gøre dette kan vi bruge en underforespørgsel i SET-sætningen. Vi kunne bruge separate udsagn, men det er nemmere at vedligeholde ved at bruge et enkelt udsagn.

Vores erklæring ville se sådan ud:

UPDATE product 
SET price = ( 
  SELECT MAX(price) * 1.2 
  FROM product 
) 
WHERE product_id = 1;

Du kan se, at SET-klausulen indeholder en underforespørgsel, som finder MAX-værdien af ​​priskolonnen i produkttabellen og multiplicerer den med 1,2 for at tilføje 20 %. Endelig er WHERE-sætningen uden for underforespørgslen for kun at opdatere product_id for 1, da den gælder for UPDATE frem for underforespørgslen.

Dette vil resultere i følgende ændring:

[tabel id=30 /]

SET og korreleret underforespørgsel

En anden måde at bruge en underforespørgsel i en UPDATE-sætning er at bruge en korreleret underforespørgsel.

Det fungerer på samme måde som det forrige eksempel. En korreleret underforespørgsel er dog en underforespørgsel, der refererer til den ydre sætning og kan være en del af en UPDATE-sætning.

Ved at bruge dataene fra det foregående eksempel (produkttabellen) ønsker virksomheden at deaktivere alle de produkter, der ikke har fået afgivet en ordre på dem. Dataene for dette er gemt i order_line tabellen.

Hvis vi skrev det som en korreleret underforespørgsel, vil forespørgslen se sådan ud:

UPDATE product p 
SET active = ( 
  SELECT 
  CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END 
  FROM order_line o 
  WHERE o.product_id = p.product_id 
);

Underforespørgslen udfører en COUNT-funktion ved hjælp af en CASE-sætning for at bestemme, om den returnerede værdi er Y eller N afhængigt af værdien af ​​COUNT. Den beregnes for hvert produkt_id og matcher den ydre forespørgsel.

Dette vil resultere i, at den aktive kolonne for nogle produkter er sat til Y og andre sat til N:

[tabel id=31 /]

HVOR større end underforespørgsel

Det er også muligt at bruge en underforespørgsel i WHERE-sætningen. Ligesom i de foregående eksempler kan dette gøres for at fjerne det separate trin med at finde en værdi, der skal opdateres, og derefter køre forespørgslen for at opdatere den.

Vi kan fortsætte med at arbejde med vores eksempel fra de foregående trin. Antag, at virksomheden ønsker at aktivere produkter, der har en pris over gennemsnittet. For at gøre dette kan vi tilføje en underforespørgsel til WHERE-sætningen.

Først skal du deaktivere alle produkter.

UPDATE product
SET active = ’N’;

Opdater derefter tabellen ved hjælp af vores underforespørgsel.

UPDATE product
SET active = 'Y'
WHERE price > (
  SELECT AVG(price)
  FROM product
);

Dette vil sætte den aktive værdi til Y for alle poster, der har en pris over gennemsnittet.

Tabellen ser nu således ud:

[tabel id=32 /]

Den viser 2 poster med en aktiv værdi på Y, fordi de er over gennemsnittet.

Denne form for forespørgsel kan også køres med andre operatorer, der tillader en enkelt værdi, såsom =.

HVOR I Underforespørgsel

Vi kan også bruge en underforespørgsel med en IN-operator i WHERE-sætningen.

Dette svarer til det foregående eksempel, der brugte større end-operatoren for en enkelt værdi. IN-operatoren kan anvendes på flere værdier.

Lad os sige, at virksomheden ønskede at opdatere prisen på nogle produkter, der var den eneste vare i kategorien. Priserne skulle halveres.

Vores forespørgsel kunne se sådan ud:

UPDATE product 
SET price = price / 2 
WHERE category_id IN ( 
  SELECT category_id 
  FROM product 
  GROUP BY category_id 
  HAVING COUNT(*) = 1 
);

Underforespørgslen finder alle kategori_id-værdier, hvor COUNT er 1. Vi behøver ikke have COUNT i SELECT-delen af ​​underforespørgslen, men hvis vi gør det, vil forespørgslen vise en fejl.

UPDATE-sætningen vil opdatere prisen, hvor kategorien opfylder kriterierne for underforespørgslen.

Vores resultater vil så se således ud:

[tabel id=33 /]

Dataene ligner meget. Produktet med et kategori-id på 1 har dog fået opdateret prisen til halvdelen af ​​dets oprindelige pris, fordi det er det eneste produkt i sin kategori.

OPDATERING underforespørgsel

Endelig kan du bruge en underforespørgsel i en UPDATE-sætning til tabellen, der skal opdateres.

I de foregående eksempler har vi netop brugt produkttabellen. Du kan dog bruge en underforespørgsel i stedet for produkttabellen, som vil returnere et resultatsæt, der kan opdateres.

Resultatsættet skal kunne opdateres, ligesom det er tilfældet, når du opretter et VIEW-objekt og forsøger at opdatere det. Det skal være enkelt og have den primære nøgle.

Antag, ved hjælp af vores tidligere eksempler, at virksomheden ønsker at ændre kategorien for alle produkter, der er i kategori 4, til kategori 5.

Vores forespørgsel kunne se sådan ud:

UPDATE (
  SELECT product_id, category_id 
  FROM product) 
SET category_id = 5 
WHERE category_id = 4;

Det er et simpelt eksempel, der demonstrerer konceptet. Tabellen er blevet erstattet med SELECT-sætningen, der kun viser to kolonner i tabellen.

Resultaterne af denne forespørgsel ville være:

[tabel id=34 /]

Det samme resultat kunne modtages ved at flytte WHERE-sætningen til UPDATE-sætningen:

UPDATE (
  SELECT product_id, category_id 
  FROM product 
  WHERE category_id = 4) 
SET category_id = 5;

Konklusion

Brug af en underforespørgsel i en UPDATE-sætning kan være en god måde at forbedre vedligeholdelsen af ​​dine forespørgsler på. Det kan også reducere antallet af nødvendige trin for at opdatere dine data ved at komprimere to eller flere forespørgsler til en enkelt forespørgsel.


  1. PostgreSQL-streaming vs logisk replikering – sammenligning

  2. Hent et objekts ID fra dets navn i SQL Server:OBJECT_ID()

  3. Sådan tilknyttes flere partitioner til en enkelt filgruppe i SQL Server (T-SQL)

  4. Det er i detaljerne