КАК ДЕЛАТЬ ОБЪЕДИНЕНИЕ ТАБЛИЦЫ С СОБОЙ ?
Для объединения таблицы с собой, вы можете сделать каждую строку таблицы, одновременно, и комбинацией ее
с собой и комбинацией с каждой другой строкой таблицы. Вы затем оцениваете каждую комбинацию в терминах
предиката, также как в обьединениях мультитаблиц. Это позволит вам легко создавать определенные виды связей
между различными позициями внутри одиночной таблицы - с помощью обнаружения пар строк со значением поля,
например. Вы можете изобразить обьединение таблицы с собой, как обьединение двух копий одной и той же таблицы.
Таблица на самом деле не копируется, но SQL выполняет команду так, как если бы это было сделано. Другими
словами, это обьединение - такое же, как и любое другое обьединение между двумя таблицами, за исключением
того, что в данном случае обе таблицы идентичны. ПСЕВДОНИМЫ Синтаксис команды для объединения таблицы с
собой, тот же что и для объединения многочисленых таблиц, в одном экземпляре. Когда вы объединяете таблицу
с собой, все повторяемые имена столбца, заполняются префиксами имени таблицы. Чтобы ссылаться к этим столбцам
внутри запроса, вы должны иметь два различных имени для этой таблицы. Вы можете сделать это с помощью определения
временных имен называемых переменными диапазона, переменными корреляции или просто - псевдонимами. Вы определяете
их в предложении FROM запроса. Это очень просто: вы набираете имя таблицы, оставляете пробел, и затем набираете
псевдоним для нее. Имеется пример который находит все пары заказчиков имеющих один и тот же самый рейтинг (вывод
показывается в Рисунке 9.1):
SELECT first.cname, second.cname, first.rating FROM Customers first, Customers second WHERE first.rating = second.rating;
Giovanni |
Giovanni |
200 |
Giovanni |
Liu |
200 |
Liu |
Giovanni |
200 |
Liu |
Liu |
200 |
Grass |
Grass |
300 |
Grass |
Cisneros |
300 |
Clemens |
Hoffman |
100 |
Clemens |
Clemens |
100 |
Clemens |
Pereira |
100 |
Cisneros |
Grass |
300 |
Cisneros |
Cisneros |
300 |
Pereira |
Hoffman |
100 |
Pereira |
Clemens |
100 |
Pereira |
Pereira |
100 |
Рисунок 9.1: Объединение таблицы с собой
( обратите внимание что на Рисунке 9.1, как и в некоторых дальнейших примерах, полный запрос не может
уместиться в окне вывода, и следовательно будет усекаться. ) В вышеупомянутой команде, SQL ведет себя
так, как если бы он соединял две таблицы называемые 'первая' и 'вторая'. Обе они - фактически, таблицы
Заказчика, но псевдонимы разрешают им быть обработаными независимо. Псевдонимы первый и второй были установлены
в предложении FROM запроса, сразу после имени копии таблицы. Обратите внимание что псевдонимы могут использоваться
в предложении SELECT, даже если они не определены в предложении FROM. Это - очень хорошо. SQL будет сначала
допускать любые такие псевдонимы на веру, но будет отклонять команду если они не определены далее в предложении
FROM запроса. Псевдоним существует - только пока команда выполняется ! Когда запрос заканчивается, псевдонимы
используемые в нем больше не имеют никакого значения. Теперь, когда имеются две копии таблицы Заказчиков,
чтобы работать с ними, SQL может обрабатывать эту операцию точно также как и любое другое обьединение -
берет каждую строку из одного псевдонима и сравнивает ее с каждой строкой из другого псевдонима.