Когда вы используете подзапросы в SQL, вы можете обратиться к внутреннему запросу таблицы в предложении внешнего запроса FROM, сформировав соотнесенный подзапрос. Когда вы делаете это, подзапрос выполняется неоднократно, по одному разу для каждой строки таблицы основного запроса.
Соотнесенный подзапрос — один из большого количества тонких понятий в SQL из-за сложности в его оценке.
Если вы сумеете овладеть им, вы найдете, что он очень мощный, потому что может выполнять сложные функции с помощью очень лаконичных указаний.
Например, имеется один способ найти всех заказчиков в Заказах на 3-е Октября (вывод показывается в Рисунке 11.1):
SELECT *
FROM Customers outer
WHERE 10/03/1990 IN (SELECT odate
FROM Orders inner
WHERE outer.cnum = inner.cnum);
=============== SQL Execution Log ============
| SELECT * |
| FROM Customers outer |
| WHERE 10/03/1990 IN |
| (SELECT odate |
| FROM Orders inner |
| WHERE outer.cnum = inner.cnum); |
| ============================================= |
| cnum cname city rating snum |
| ----- -------- ---- ------ ----- |
| 2001 Hoffman London 100 1001 |
| 2003 Liu San Jose 200 1002 |
| 2008 Cisneros San Jose 300 1007 |
| 2007 Pereira Rome 100 1004 |
===============================================
Рисунок 11.1. Использование соотнесенного подзапроса.
Примечание. В СУБД Interbase "INNER" и "OUTER" являются ключевыми словами, описывающими тип объединения (JOIN TYPE) поэтому запрос должен быть изменен, например, так:
SELECT *
FROM Customers out
WHERE CAST('10/03/1990' AS DATE) IN (SELECT odate
FROM Orders inn
WHERE out.cnum = inn.cnum);