Читайте также:
|
|
Связанные подзапросы часто используются в условиях равенства и вхо_ ждения в диапазон, но самый распространенный оператор, применяе_ мый в условиях со связанными подзапросами, – это оператор exists (су_ ществует). Оператор exists применяется, если требуется показать, что связь есть, а количество связей при этом не имеет значения. Например, следующий запрос находит все счета, для которых транзакция была выполнена в определенный день, без учета количества транзакций:
SELECT a.account_id, a.product_cd, a.cust_id, a.avail_balance
FROM account a
WHERE EXISTS (SELECT 1
FROM transaction t
WHERE t.account_id = a.account_id
AND t.txn_date = '2005_01_22');
При использовании оператора exists подзапрос может возвращать ни одной, одну или много строк, а условие просто проверяет, возвращены ли в результате выполнения подзапроса строки (все равно сколько). Если взглянуть на блок select подзапроса, можно увидеть, что он со_ стоит из единственного литерала (1); для условия основного запроса имеет значение только число возвращенных строк, а что именно было возвращено подзапросом – не важно. Подзапрос может возвращать все, что вам вздумается, как показывает следующий пример:
SELECT a.account_id, a.product_cd, a.cust_id, a.avail_balance
FROM account a
WHERE EXISTS (SELECT t.txn_id, 'hello', 3.1415927
FROM transaction t
WHERE t.account_id = a.account_id
AND t.txn_date = '2005_01_22');
Но все же при использовании exists принято задавать select 1 или select *.
Для поиска подзапросов, не возвращающих строки, можно использо_ вать и оператор not exists:
mysql> | SELECT a.account_id, a.product_cd, a.cust_id |
_> | FROM account a |
_> | WHERE NOT EXISTS (SELECT 1 |
_> | FROM business b |
_> | WHERE b.cust_id = a.cust_id); |
182 Глава 9. Подзапросы
+____________+____________+_________+ | account_id | product_cd | cust_id | +____________+____________+_________+
| | | | CHK | | | | | ||
| | | | SAV | | | | | ||
| | | | CD | | | | | ||
| | | | CHK | | | | | ||
| | | | SAV | | | | | ||
| | | | CHK | | | | | ||
| | | | MM | | | | | ||
| | | | CHK | | | | | ||
| | | | SAV | | | | | ||
| | | | MM | | | | | ||
| | | | CHK | | | | | ||
| | | | CHK | | | | | ||
| | | | CD | | | | | ||
| | | | CD | | | | | ||
| | | | CHK | | | | | ||
| | | | SAV | | | | | ||
| | | | CHK | | | | | ||
| | | | MM | | | | | ||
| | | | CD | | | | |
+____________+____________+_________+ 19 rows in set (0.04 sec)
Этот запрос выявляет всех клиентов, ID которых нет в таблице busi_ ness, – окольный путь для поиска всех клиентов_физических лиц.
Дата добавления: 2015-08-17; просмотров: 50 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Gt; FROM customer c | | | Манипулирование данными с помощью связанных подзапросов |