Иногда приходится выполнять запросы, в которых таблица соединяется сама с собой, или одна таблица соединяется дважды с другой таблицей. При этом используются имена корреляции (алиасы,псевдонимы), которые позволяют различать соединяемые копии таблиц. Имена корреляции вводятся в разделе FROM и идут через пробел после имени таблицы. Имена корреляции должны использоваться в качестве префикса перед именем столбца и отделяются от имени столбца точкой. Если в запросе указываются одни и те же поля из разных экземпляров одной таблицы, они должны быть переименованы для устранения неоднозначности в именованиях колонок результатирующей таблицы. Определение имени корреляции действует только во время выполнения запроса.
Пример 19. Отобрать все пары поставщиков таким образом, чтобы первый поставщик в паре имел статус, больший статуса второго поставщика:
SELECT
P1.PNAME AS PNAME1,
P1.PSTATUS AS PSTATUS1,
P2.PNAME AS PNAME2,
P2.PSTATUS AS PSTATUS2
FROM
P P1, P P2
WHERE P1.PSTATUS1 > P2.PSTATUS2;
В результате получим следующую таблицу:
PNAME1
PSTATUS1
PNAME2
PSTATUS2
Иванов
Петров
Иванов
Сидоров
Сидоров
Петров
Пример 20. Рассмотрим ситуацию, когда некоторые поставщики (назовем их контрагенты) могут выступать как в качестве поставщиков деталей, так и в качестве получателей. Таблицы, хранящие данные могут иметь следующий вид:
Номер контрагента NUM
Наименование контрагента NAME
Иванов
Петров
Сидоров
Таблица 3 Отношение CONTRAGENTS
Номер детали DNUM
Наименование детали DNAME
Болт
Гайка
Винт
Таблица 4 Отношение DETAILS (Детали)
Номер поставщика PNUM
Номер получателя CNUM
Номер детали DNUM
Поставляемое количество VOLUME
Таблица 5 Отношение CD (Поставки)
В таблице CD (поставки) поля PNUM и CNUM являются внешними ключами, ссылающимися на потенциальный ключ NUM в таблице CONTRAGENTS.
Ответ на вопрос "кто кому что в каком количестве поставляет" дается следующим запросом:
SELECT
P.NAME AS PNAME,
C.NAME AS CNAME,
DETAILS.DNAME,
CD.VOLUME
FROM
CONTRAGENTS P,
CONTRAGENTS C,
DETAILS,
CD
WHERE
P.NUM = CD.PNUM AND
C.NUM = CD.CNUM AND
D.DNUM = CD.DNUM;
В результате получим следующую таблицу:
Наименование поставщика PNAME
Наименование получателя CNAME
Наименование детали DNAME
Поставляемое количество VOLUME
Иванов
Петров
Болт
Иванов
Сидоров
Гайка
Иванов
Сидоров
Винт
Петров
Сидоров
Болт
Петров
Сидоров
Гайка
Сидоров
Иванов
Болт
Замечание. Этот же запрос может быть выражен очень большим количеством способов, например, так: