Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

Некоторые многотабличные запросы используют отношения, существующие внутри одной из таблиц. Предположим, например, что требуется вывести список имен всех служащих и их руководителей. Каждому служащему соответствует одна строка в таблице 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 присваивается только одной "копии" таблицы, а для другой используется собственное имя таблицы. Вот еще два примера самообъединения:

<== предыдущая лекция | следующая лекция ==>
Чтение всех столбцов | Правила выполнения многотабличных запросов
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 429; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.