WHERE t.account_id = a.account_id );
Подзапрос теперь включает условие фильтрации, связывающее ID сче
та транзакции и ID счета из основного запроса. Изменился и блок
se
lect
– теперь вместо жестко запрограммированного значения
1
он пу
тем конкатенации формирует предупреждение, включающее ID счета.
Оператор exists Связанные подзапросы часто используются в условиях равенства и вхо
ждения в диапазон, но самый распространенный оператор, применяе
мый в условиях со связанными подзапросами, – это оператор
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 = '20050122');
При использовании оператора
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 = '20050122');
Но все же при использовании
exists
принято задавать
select 1
или
select *
.
Для поиска подзапросов, не возвращающих строки, можно использо
вать и оператор
not
exists
:
mysql>