sql >> Databasteknik >  >> RDS >> Oracle

5 sätt att uppdatera data med en underfråga i Oracle SQL

En underfråga är ett kraftfullt sätt att hitta den data du vill använda för en annan fråga. De används ofta i SELECT- och UPDATE-satser för att göra dessa frågor mer effektiva och lättare att underhålla.

Det finns flera olika sätt att använda underfrågor i UPDATE-satser. Låt oss ta en titt på var och en av dem.

SET och Subquery

Den första metoden vi kommer att titta på är att använda en underfråga i SET-satsen i en UPDATE-sats.

Låt oss säga att vi hade en tabell med produkter som såg ut så här:

[tabell id=29 /]

Den lagrar lite information om olika produkter som ett företag säljer.

Antag att företaget bestämde sig för att höja priset på "Couch"-produkten (produkt-id 1). Men istället för att sätta ett specifikt pris vill de göra det 20 % högre än den dyraste produkten de har.

För att göra detta kan vi använda en underfråga i SET-satsen. Vi skulle kunna använda separata påståenden, men det är lättare att underhålla med ett enda påstående.

Vårt uttalande skulle se ut så här:

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

Du kan se att SET-satsen innehåller en underfråga, som hittar MAX-värdet för priskolumnen i produkttabellen och multiplicerar det med 1,2 för att lägga till 20 %. Slutligen, WHERE-satsen är utanför underfrågan för att endast uppdatera produkt-id för 1, eftersom den gäller för UPDATE snarare än för underfrågan.

Detta kommer att resultera i följande ändring:

[tabell id=30 /]

SET och Correlated Subquery

Ett annat sätt att använda en underfråga i en UPDATE-sats är att använda en korrelerad underfråga.

Det fungerar på liknande sätt som i föregående exempel. En korrelerad underfråga är dock en underfråga som hänvisar till den yttre satsen och kan vara en del av en UPDATE-sats.

Med hjälp av data från föregående exempel (produkttabellen) vill företaget avaktivera alla produkter som inte har fått en beställning för dem. Data för detta lagras i order_line-tabellen.

Om vi ​​skrev det som en korrelerad underfråga, kommer frågan att se ut så här:

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 
);

Underfrågan kommer att utföra en COUNT-funktion med hjälp av en CASE-sats för att avgöra om det returnerade värdet är Y eller N beroende på värdet på COUNT. Den beräknas för varje produkt-id och matchar den yttre frågan.

Detta kommer att resultera i att den aktiva kolumnen för vissa produkter är inställd på Y och andra till N:

[tabell id=31 /]

VAR större än underfråga

Det är möjligt att använda en underfråga i WHERE-satsen också. Precis som i de tidigare exemplen kan detta göras för att ta bort det separata steget att hitta ett värde som ska uppdateras och sedan köra frågan för att uppdatera det.

Vi kan fortsätta arbeta med vårt exempel från de tidigare stegen. Antag att företaget vill aktivera produkter som har ett pris över genomsnittet. För att göra detta kan vi lägga till en underfråga till WHERE-satsen.

Avaktivera först alla produkter.

UPDATE product
SET active = ’N’;

Uppdatera sedan tabellen med hjälp av vår underfråga.

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

Detta kommer att ställa in det aktiva värdet till Y för alla poster som har ett pris över genomsnittet.

Tabellen ser nu ut så här:

[tabell id=32 /]

Den visar 2 poster med ett aktivt värde på Y eftersom de ligger över genomsnittet.

Den här typen av fråga kan också köras med andra operatorer som tillåter ett enda värde, som =.

WHERE IN Subquery

Vi kan också använda en underfråga med en IN-operator i WHERE-satsen.

Detta liknar det tidigare exemplet som använde operatorn större än för ett enskilt värde. IN-operatorn kan tillämpas på flera värden.

Låt oss säga att företaget ville uppdatera priset på några produkter som var den enda artikeln i kategorin. Priserna skulle behöva halveras.

Vår fråga kan se ut så här:

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

Underfrågan hittar alla category_id-värden där COUNT är 1. Vi behöver inte ha COUNT i SELECT-delen av underfrågan, men om vi gör det kommer frågan att visa ett fel.

UPDATE-satsen kommer att uppdatera priset där kategorin uppfyller kriterierna för underfrågan.

Våra resultat kommer då att se ut så här:

[tabell id=33 /]

Uppgifterna ser väldigt lika ut. Produkten med kategori-ID 1 har dock fått sitt pris uppdaterat till hälften av sin ursprungliga kostnad, eftersom det är den enda produkten i sin kategori.

UPPDATERA underfråga

Slutligen kan du använda en underfråga i en UPDATE-sats för att tabellen ska uppdateras.

I de tidigare exemplen har vi precis använt produkttabellen. Du kan dock använda en underfråga istället för produkttabellen, som returnerar en resultatuppsättning som kan uppdateras.

Resultatuppsättningen måste vara uppdateringsbar, liknande fallet när du skapar ett VIEW-objekt och försöker uppdatera det. Det måste vara enkelt och ha den primära nyckeln.

Med hjälp av våra tidigare exempel, anta att företaget vill ändra kategorin för alla produkter som är i kategori 4 till kategori 5.

Vår fråga kan se ut så här:

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

Det är ett enkelt exempel som visar konceptet. Tabellen har ersatts med SELECT-satsen som bara visar två kolumner i tabellen.

Resultatet av denna fråga skulle bli:

[tabell id=34 /]

Samma resultat kan erhållas genom att flytta WHERE-satsen till UPDATE-satsen:

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

Slutsats

Att använda en underfråga i en UPDATE-sats kan vara ett bra sätt att förbättra underhållsbarheten för dina frågor. Det kan också minska antalet steg som krävs för att uppdatera dina data genom att komprimera två eller flera frågor till en enda fråga.


  1. ClusterControl - Advanced Backup Management - mariabackup del III

  2. Hur man skapar PL/SQL-paket i Oracle Database

  3. SQL Server 2016:sys.dm_exec_function_stats

  4. Hur man övervakar PostgreSQL som körs inuti en Docker-behållare:Del två