Теперь рассмотрим различия между вложенным запросом и соединением. На практике соединение во многих случаях можно использовать в качестве альтернативы вложенным запросам. Например, ранее в разделе 2.2.7 был использован вложенный запрос для нахождения названия работ, которые были проданы галереей дороже 20000. Этот же запрос можно реализовать и с помощью соединения:
SELECT DISTINCT Title
FROM WORK JOIN TRANSACTION
ON WORK.WorkID = TRANSACTION.WorkID
AND AskingPrice > 20000;
Хотя ситуации, когда соединение можно использовать вместо вложенного запроса, нередки, такая замена все же возможна не всегда. Например, соединения не могут заменить коррелированные вложенные запросы, а также запросы с использованием ключевых слов EXISTSи NOT EXISTS (будут рассматриваться далее в других разделах пособия).
И наоборот, не всегда вложенный запрос может служить заменой для соединения. В соединении запрашиваемые столбцы могут принадлежать любой из соединяемых таблиц, а во вложенном запросе все возвращаемые столбцы должны принадлежать только одной таблице, а именно той, которая указана в предложении FROM самого первого оператора SELECT. Например, в следующем вложенном запросе в результат войдут только столбцы таблицы ARTIST:
SELECT DISTINCT Name FROM ARTIST WHERE ArtistID IN (SELECT ArtistID
FROM WORK
WHERE WorkID IN (SELECT WorkID
FROM TRANSACTION
WHERE AskingPrice > 20000));
Если нужно включить в результат столбцы WORK.Title, придется использовать соединение:
SELECT A.Name, W.Title
FROM ARTIST A JOIN WORK W
ON A.ArtistID = W.ArtistID
JOIN TRANSACTION
ON TRANSACTION.WorkID = W.WorkID
AND AskingPrice > 20000;
предыдущаяследующая