3.2.7. Соединение таблицы со своей копией

В ряде приложений возникает необходимость одновременной обработки данных какой-либо таблицы и одной или нескольких ее копий, создаваемых на время выполнения запроса.

Например, при создании списков студентов (таблица Студенты) возможен повторный ввод данных о каком-либо студенте с присвоением ему второго номера зачетной книжки. Для выявления таких ошибок можно соединить таблицу Студенты с ее временной копией, установив в WHERE фразе равенство значений всех одноименных столбцов этих таблиц кроме столбцов с номером зачетной книжки (для последних надо установить условие неравенства значений).

Временную копию таблицы можно сформировать, указав имя псевдонима за именем таблицы во фразе FROM. Так, с помощью фразы

    FROM Блюда X, Блюда Y, Блюда Z

будут сформированы три копии таблицы Блюда с именами X, Y и Z.

В качестве примера соединения таблицы с ней самой сформируем запрос на вывод таких пар блюд таблицы Блюда, в которых совпадает основа, а название первого блюда пары меньше (по алфавиту), чем номер второго блюда пары. Для этого можно создать запрос с одной копией таблицы Блюда (Копия):

    SELECT	Блюдо, Копия.Блюдо, Основа
    FROM	Блюда, Блюда Копия
    WHERE	Основа = Копия.Основа
    AND	Блюдо < Копия.Блюдо;

или двумя ее копиями (Первая и Вторая):

    SELECT	Первая.Блюдо, Вторая.Блюдо, Основа
    FROM	Блюда Первая, Блюда Вторая
    WHERE	Первая.Основа = Вторая.Основа
    AND	Первая.Блюдо < Вторая.Блюдо;

Получим результат вида

Первая.Блюдо | Вторая.Блюдо | Основа
--- | --- | ---
Морковь с рисом | Помидоры с луком | Овощи
Морковь с рисом | Салат летний | Овощи
Морковь с рисом | Салат витаминный | Овощи
Помидоры с луком | Салат витаминный | Овощи
Помидоры с луком | Салат летний | Овощи
Салат витаминный | Салат летний | Овощи
Бастурма | Бефстроганов | Мясо
Бастурма | Мясо с гарниром | Мясо
Бефстроганов | Мясо с гарниром | Мясо

3.2.6 | Содержание | 3.3.1