Коррелированная обработка
В коррелированном подзапросе внутренний запрос не может быть реализован немедленно: он ссылается на внешний запрос и выполняется поочередно для каждой строки во внешнем запросе.
SQL:
SELECT lastname, name
FROM
tbl_clients
WHERE 1 IN (
SELECT service_id
FROM tbl_contract
WHERE tbl_clients.client_id =
tbl_contract.client_id)
С концептуальной точки зрения обработка включает следующие этапы.
Внешний запрос отыскивает первое имя в таблице tbl_clients (допустим, Tate Dustin). Чтобы найти требуемые строки в таблице tbl_contracts, внутренний запрос объединяет соответствующий tbl.clients.client_id (334) с tbl_contracts_client_id (в результате находится 3 строки). Затем внутренний запрос возвращает этот результат в предложение IN внешнего запроса, где значение в полн service_id сравнивается с 1. Одна из услуг, которыми пользуется клиент имеет код 1, но этого достаточно: запись о клиенте Tate Dustin удовлетворяет требуемым критериям.
Затем снова начинает работать подзапрос, на этот раз пользуясь client_ id следующей строки из таблицы clients_id (101). Он отыскивает еще три строки, но ни одна из них не содержит в поле service_id значение 1. Таким образом, данные о клиенте с идентификационным номером 101 (Tindall Jodie) не попадают в таблицу с результатами запроса. Таким образом подрапрос выполняется для всех строк таблицы tbl_clients.
Коррелированные запросы требуют явного указания имен столбцов из внешнего запроса. Принадлежность таблицам столбцов во внутреннем запросе задается неявно.