double arrow

САМООБЪЕДИНЕНИЯ


Некоторые многотабличные запросы используют отношения, существующие внутри одной из таблиц. Предположим, например, что требуется вывести список имен всех служащих и их руководителей. Каждому служащему соответствует одна строка в таблице salesreps, а столбец manager содержит идентификатор служащего, являющегося руководителем. Столбцу manager следовало бы быть внешним ключом для таблицы, в которой хранятся данные о руководителях. И он им, фактически, является — это внешний ключ для самой таблицы salesreps!

Если бы вы попытались создать этот запрос как любой другой запрос к двум таблицам с отношением "первичный ключ — внешний ключ", то он выглядел бы так:

Этот оператор select является неправильным из-за двойной ссылки на таблицу salesreps в предложении from. Вы могли бы попробовать убрать вторую ссылку на таблицу salesreps:

Такой запрос будет правильным, но он не сделает того, что вам нужно. Это однотабличный запрос, поэтому SQL поочередно просматривает все строки таблицы salesreps, чтобы найти те, которые удовлетворяют условию поиска:

MANAGER = EMPL NUM

Этому условию удовлетворяют строки, в которых два столбца имеют одинаковые значения — т.е. служащий является своим руководителем. Таких строк нет, поэтому запрос не дает никакого результата.




Чтобы понять, как в SQL решается эта проблема, представим себе, что имеются две идентичные копии таблицы salesreps. Одна копия называется emps и содержит список служащих, а другая называется mgrs и содержит список руководителей (см. рис. 7.9). Столбец manager таблицы emps является внешним ключом для таблицы mgrs, и следующий запрос будет работать:

Так как столбцы в двух таблицах имеют идентичные имена, все ссылки на столбцы являются полными. Иначе говоря, этот запрос выглядит как обычный запрос к двум таблицам.

Для объединения таблицы с самой собой в SQL применяется именно такой подход: использование "воображаемой копии". Вместо того чтобы на самом деле сделать копию таблицы, SQL просто позволяет вам сослаться на нее, используя другое имя, которое называется псевдонимом таблицы. Вот тот

Этому условию удовлетворяют строки, в которых два столбца имеют одинаковые значения — т.е. служащий является своим руководителем. Таких строк нет, поэтому запрос не дает никакого результата.

Чтобы понять, как в SQL решается эта проблема, представим себе, что имеются две идентичные копии таблицы salesreps. Одна копия называется emps и содержит список служащих, а другая называется mgrs и содержит список руководителей (см. рис. 7.9). Столбец manager таблицы emps является внешним ключом для таблицы mgrs, и следующий запрос будет работать:

Так как столбцы в двух таблицах имеют идентичные имена, все ссылки на столбцы являются полными. Иначе говоря, этот запрос выглядит как обычный запрос к двум таблицам.



Для объединения таблицы с самой собой в SQL применяется именно такой подход: использование "воображаемой копии". Вместо того чтобы на самом деле сделать копию таблицы, SQL просто позволяет вам сослаться на нее, используя другое имя, которое называется псевдонимом таблицы. Вот тот же самый запрос, записанный с использованием псевдонимов emps и mgrs для таблицы salesreps;

В предложении from для каждой "копии" таблицы salesreps назначается псевдоним. Это осуществляется следующим образом: псевдоним ставится непосредственно после действительного имени таблицы. Как видно из примера, если в предложений from содержится псевдоним таблицы, то в полной ссылке на столбец должен использоваться псевдоним, а не действительное имя таблицы. Конечно, на самом деле в этом запросе необходимо применять псевдоним только для одной из двух "копий" таблицы. Запрос вполне можно записать так:

Здесь псевдоним mgrs присваивается только одной "копии" таблицы, а для другой используется собственное имя таблицы. Вот еще два примера самообъединения:







Сейчас читают про: