Sql Scholl
Распечатать страницу
Перейти на главную Карта сайта Отправить сообщение

Расширенные объединения

Использование объединений других типов

      До сих пор вы использовали только простые объединения, которые называют внутренние объединения или объединения по эквивалентности. Теперь мы рассмотрим три дополнительных типа объединения: самообъединение, естественное объединение и внешнее объединение.

Самообъединения

      В первом решении используются подзапросы. Внутренний оператор SELECT выполняет простую выборку, чтобы возвратить имя компании (cust_name), с которой работает Джим Джонс. Только это имя используется в предложении WHERE внешнего запроса, так что выбираются имена всех служащих, работающих с этой компанией. (Все о подзапросах читайте в разделе, "Использование подзапросов".

      Теперь рассмотрим тот же самый запрос, в котором используется объединение:

SELECT cust_id, cust_name, cust_contact
FROM Customers
WHERE cust_name = (SELECT cust_name
FROM Customers
WHERE oust_contact = 'Jim Jones');



cust_id           cust_name           cust_contact
--------------    --------------      --------------------- 
1000000003        Fun4All             Jim Jones
1000000004        Fun4All             Denise L. Stephens

     Одна из основных причин для использования псевдонимов таблиц состоит в возможности обращения к одной и той таблице несколько раз в одном операторе SELECT. Покажем это на примере.

     Предположим, вы хотите послать письма по всем контактным адресам клиентов, которые работают с той же компанией, с которой работает Джим Джонс. Такой запрос требует, чтобы вначале вы выяснили, с какой компанией работает Джим Джонс, а затем — какие клиенты работают с этой же компанией. Вот один из способов решения этой задачи.

SELECT cl.cust_id, cl.cust_name, cl.cust_contact FROM Customers AS cl, Customers AS c2 WHERE cl.cust_name = c2.cust_name AND c2.cust_contact = 'Jim Jones';



cust_id             cust_name         cust_contact
------------------     ----------------------   -------------------------------
1000000003      Fun4All               Jim Jones
1000000004   Fun4All       Denise L. Stephens

      Две таблицы, необходимые для выполнения запроса, на самом деле — одна и та же таблица, поэтому таблица Customers появляется в предложении FROM дважды. Хотя это совершенно законно, некоторые ссылки на таблицу Customers могли бы оказаться неоднозначными, потому что СУБД "не знает", на какую именно таблицу Customers вы ссылаетесь.

      Для решения этой проблемы используются псевдонимы. Первый раз для таблицы Customers назначается псевдоним С1, второй — псевдоним С2. Теперь эти псевдонимы можно применять в качестве имен таблиц. Например, оператор SELECT использует префикс С1 для однозначного указания полного имени нужного столбца. Если этого не сделать, СУБД возвратит сообщение об ошибке, потому что имеется по два столбца с именами cust_id, cust_name и cust_contact. СУБД не может знать, какой именно столбец вы имеете в виду (даже если в действительности это один и тот же столбец). Первое предложение WHERE объединяет эти таблицы, а затем оно фильтрует данные второй таблицы по столбцу cust_contact, чтобы возвратить только нужные данные.

Самообъединения вместо подзапросов

Самообъединения часто используют для замены операторов, применяющих подзапросы, которые выбирают данные из той же таблицы, что и внешний оператор. Хотя конечный результат получается тем же самым, многие СУБД обрабатывают объединения намного быстрее, чем подзапросы. Стоит поэкспериментировать с тем и другим, чтобы определить, какой запрос работает быстрее.