Oracle
 sql >> база данни >  >> RDS >> Oracle

5 начина за актуализиране на данни с подзаявка в Oracle SQL

Подзаявката е мощен начин да намерите данните, които искате да използвате за друга заявка. Те често се използват в изрази SELECT и UPDATE, за да направят тези заявки по-ефективни и по-лесни за поддръжка.

Има няколко различни начина за използване на подзаявки в операторите UPDATE. Нека да разгледаме всеки един от тях.

SET и подзаявка

Първият метод, който ще разгледаме, е използването на подзаявка в клаузата SET на оператор UPDATE.

Да кажем, че имаме таблица с продукти, която изглеждаше така:

[table id=29 /]

Той съхранява няколко части от информация за различни продукти, които една компания продава.

Да приемем, че компанията е решила да увеличи цената на продукта „Диван“ (идентификатор на продукта 1). Въпреки това, вместо да определят конкретна цена, те искат да я направят с 20% по-висока от най-скъпия продукт, който имат.

За да направим това, можем да използваме подзаявка в клаузата SET. Можем да използваме отделни изрази, но е по-лесно да се поддържа с помощта на един израз.

Нашето изявление би изглеждало така:

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

Можете да видите, че клаузата SET включва подзаявка, която намира MAX стойността на колоната с цена в таблицата с продуктите и я умножава по 1,2, за да добави 20%. И накрая, клаузата WHERE е извън подзаявката, за да актуализира само product_id от 1, тъй като се прилага за UPDATE, а не за подзаявката.

Това ще доведе до следната промяна:

[table id=30 /]

SET и корелирана подзаявка

Друг начин да използвате подзаявка в израз UPDATE е да използвате корелирана подзаявка.

Работи по подобен начин на предишния пример. Въпреки това, корелирана подзаявка е подзаявка, която се отнася до външния израз и може да бъде част от оператор UPDATE.

Използвайки данните от предишния пример (таблицата с продукти), компанията иска да деактивира всички продукти, за които не е направена поръчка за тях. Данните за това се съхраняват в таблицата order_line.

Ако го напишем като корелирана подзаявка, заявката ще изглежда така:

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

Подзаявката ще изпълни функция COUNT, използвайки оператор CASE, за да определи дали върнатата стойност е Y или N в зависимост от стойността на COUNT. Изчислява се за всеки product_id и съответства на външната заявка.

Това ще доведе до активната колона за някои продукти, зададена на Y, а други на N:

[table id=31 /]

WHERE по-голямо от подзаявка

Възможно е да се използва и подзаявка в клаузата WHERE. Точно както в предишните примери, това може да се направи, за да се премахне отделната стъпка от намиране на стойност, която трябва да се актуализира, и след това да се изпълни заявката, за да се актуализира.

Можем да продължим да работим с нашия пример от предишните стъпки. Да приемем, че компанията иска да активира продукти, които имат цена над средната. За да направим това, можем да добавим подзаявка към клаузата WHERE.

Първо, деактивирайте всички продукти.

UPDATE product
SET active = ’N’;

След това актуализирайте таблицата, като използвате нашата подзаявка.

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

Това ще зададе активната стойност на Y за всички записи, които имат цена над средната.

Сега таблицата изглежда така:

[table id=32 /]

Показва 2 записа с активна стойност Y, защото са над средните.

Този вид заявка може да се изпълнява и с други оператори, които позволяват една стойност, като <или>=.

КЪДЕ В подзаявка

Също така можем да използваме подзаявка с оператор IN в клаузата WHERE.

Това е подобно на предишния пример, който използва оператора по-голямо от за една стойност. Операторът IN може да се приложи към множество стойности.

Да кажем, че компанията искаше да актуализира цената на някои продукти, които бяха единственият артикул в категорията. Цените ще трябва да бъдат намалени наполовина.

Нашата заявка може да изглежда така:

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

Подзаявката намира всички стойности на category_id, където COUNT е 1. Не е необходимо да имаме COUNT в частта SELECT на подзаявката, но ако го направим, заявката ще покаже грешка.

Инструкцията UPDATE ще актуализира цената, където категорията отговаря на критериите на подзаявката.

Тогава нашите резултати ще изглеждат така:

[table id=33 /]

Данните изглеждат много сходни. Въпреки това, цената на продукта с идентификатор на категория 1 е актуализирана до половината от първоначалната му цена, тъй като това е единственият продукт в своята категория.

Подзаявка за АКТУАЛИЗИРАНЕ

И накрая, можете да използвате подзаявка в оператор UPDATE, за да се актуализира таблицата.

В предишните примери току-що използвахме таблицата с продуктите. Можете обаче да използвате подзаявка вместо таблицата с продукти, която ще върне набор от резултати, който може да бъде актуализиран.

Резултатът трябва да може да се актуализира, подобно на случая, когато създавате VIEW обект и се опитвате да го актуализирате. Трябва да е прост и да има първичен ключ.

По този начин, използвайки предишните ни примери, да предположим, че компанията иска да промени категорията за всички продукти, които са от категория 4, към категория 5.

Нашата заявка може да изглежда така:

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

Това е прост пример, който демонстрира концепцията. Таблицата е заменена с израза SELECT, който показва само две колони от таблицата.

Резултатите от тази заявка ще бъдат:

[table id=34 /]

Същият резултат може да бъде получен чрез преместване на клаузата WHERE в оператора UPDATE:

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

Заключение

Използването на подзаявка в оператор UPDATE може да бъде добър начин за подобряване на поддръжката на вашите заявки. Той също така може да намали броя на стъпките, необходими за актуализиране на вашите данни, като компресира две или повече заявки в една заявка.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Форматът на датата по подразбиране на Oracle е ГГГГ-ММ-ДД, ЗАЩО?

  2. Процедурата на Oracle не връща резултати при изпълнение от задача на скрипт на SSIS

  3. как да предам име на таблица като параметър на съхранената процедура?

  4. Как да проверя версията на JDK в Oracle?

  5. SQL вътрешно присъединяване при избрани изрази