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

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

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

SELECT DISTINCT snum

FROM Customers oouter

WHERE EXISTS

( SELECT *

FROM Customers iinner

WHERE iinner.snum = oouter.snum

AND iinner.cnum <> oouter.cnum );

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

| SELECT DISTINCT snum |

| FROM Customers oouter |

| WHERE EXISTS |

| (SELECT * |

| FROM Customers iinner |

| WHERE iinner.snum = oouter.snum |

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

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

| snum |

| ----- |

| 1001 |

| 1002 |

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

Для кожного рядка-кандидата зовнішнього запиту (замовника, що перевіряється в даний момент), внутрішній запит знаходить рядки, які співпадають із значен-ням поля snum (яке мав продавець), але не із значенням поля cnum (яке відповідає іншим замовникам). Якщо такі рядки знайдено внутрішнім запитом, це означає, що є два різних замовника, які обслуговуються поточним продавцем (тобто продавцем замовника в поточному рядку-кандидаті із зовнішнього запи-ту). Предикат EXISTS відповідно істинний для поточного рядка, і тому номер продавця з поля (snum) таблиці, яка вказана в зовнішньому запиті, буде виве-дено. Оскільки вказано параметр DISTINCT, кожен з цих продавців буде вибраний лише один раз для кожного замовника, до якого він призначений.

1.3. Комбінація оператора exists і з’єднання.

Бувають випадки, коли нам необхідно вивести більше інформації про самих продавців, а не тільки їх номери. Це можна зробити з’єднавши таблицю Замовників з таблицею Продавців:

SELECT DISTINCT first.snum, sname, first.city

FROM Salespeople first, Customers second

WHERE EXISTS

( SELECT *

FROM Customers third

WHERE second.snum = third.snum

AND second.cnum <> third.cnum )

AND first.snum = second.snum;

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

| SELECT DISTINCT first.snum, sname, first.city |

| FROM Salespeople first, Customers second |

| WHERE EXISTS |

| (SELECT * |

| FROM Customers third |

| WHERE second.snum = third.snum |

| AND second.cnum <> third.cnum) |

| AND first.snum = second.snum; |

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

| snum sname city |

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

| 1001 Peel London |

| 1002 Serres San Jose |

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

Внутрішній запит – це з’єднання таблиці Продавців з таблицею Замовників. Нове речення основного предикату (AND first.snum=second.snum) оцінюється на тому ж рівні, що і речення EXISTS. Це – функціональний предикат самого з’єднання, що порівнює дві таблиці з зовнішнього запиту в термінах поля snum, яке є для них загальним. Логічні оператори AND, вказують на те, що результати підзапиту мають смисл лише в тех випадках, коли друга частина запиту істинна, а з’єднання – виконується. Таким чином, комбінація з’єднання і підзапиту може стати потужним засобом обробки даних.

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