Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fondovi-lekcii.doc
Скачиваний:
20
Добавлен:
10.11.2018
Размер:
4.09 Mб
Скачать

1.4. Використання not exists.

В попередньому прикладі EXISTS використовувався сумістно з логічними операторами. Логічний оператор, який найчастіше використовується з EXISTS – це оператор NOT. Один із способів, за допомогою яких можна знайти всіх продавців, що мають лише одного замовника, полягає в інвертуванні попереднього прикладу.

SELECT DISTINCT snum

FROM Customers oouter

WHERE NOT EXISTS(SELECT * FROM Customers iinner

WHERE iinner.snum = oouter.snum

AND iinner.cnum < > oouter.cnum );

=============== SQL Execution Log ============

| SELECT DISTINCT snum |

| FROM Salespeople oouter |

| WHERE NOT EXISTS |

| (SELECT * |

| FROM Customers iinner |

| WHERE iinner.snum = oouter.snum |

| AND iinner.cnum < > oouter.cnum); |

| ============================================= |

| cnum |

| ----- |

| 1003 |

| 1004 |

| 1007 |

=============================================

1.5. Використання складних підзаписів з оператором exists.

Програми підзапитів можуть бути багатократно вкладуваними. Ви можете вкладувати їх два або більше в одиночний запит, і навіть один всередину другого. Розглянемо запит, який виводить рядки всіх продавців, що мають замовників з більше ніж одним поточним порядком. Виведення цієї інформації пов’язує всі три наші типові таблиці:

SELECT *

FROM Salespeople first

WHERE EXISTS

( SELECT *

FROM Customers second

WHERE first.snum = second.snum

AND 1 <

( SELECT COUNT (*)

FROM Orders

WHERE Orders.cnum = second.cnum ));

=============== SQL Execution Log ============

| FROM Salespeople first |

| WHERE EXISTS |

| (SELECT * |

| FROM Customers second |

| WHERE first.snum = second.snum |

| AND 1 < |

| (SELECT CONT (*) |

| FROM Orders |

| WHERE Orders.cnum = second.cnum)); |

| ============================================= |

| cnum cname city comm |

| ----- -------- ---- -------- |

| 1001 Peel London 0.17 |

| 1002 Serres San Jose 0.13 |

| 1007 Rifkin Barselona 0.15 |

=============================================

Цей запит виконується приблизно так. Беремо кожен рядок таблиці Продавців як рядок-кандидат (зовнішній запит) і виконуємо підзапити. Для кожного рядка-кандидата із зовнішнього запиту, беремо у відповідність кожен рядок із таблиці Замовників (середній запит). Якщо поточний рядок замовників не співпадає з поточним рядком продавця (тобто, якщо first.snum <> second.snum ), предикат середнього запиту неістинний. Всякий раз, коли ми знаходимо замовника в средньому запиті, який співпадає з продавцем у зовнішньому запиті, ми повинні розглядати сам внутрішній запит, щоб визначити, чи буде наш середний предикат запиту істинний. Внутрішній запит зчитує число порядків поточного замов-ника (із середнього запиту). Якщо це число більше, ніж 1, предикат середнього запиту істинний, і рядки вибираються. Це робить EXISTS-предикат зовнішнього запиту істинним для поточного рядка продавця, і означає, що, по меншій мірі, один із поточних замовників продавця має більш ніж один порядок.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]