Базы данных

Чтение данных из нескольких таблиц с помощью операции соединения

Теперь рассмотрим различия между вложенным запросом и соединением. На практике соединение во многих случаях можно использовать в качестве альтернативы вложенным запросам. Например, ранее в разделе 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;

предыдущаяследующая