Использование имен корреляции (алиасов, псевдонимов)
Иногда приходится выполнять запросы, в которых таблица соединяется сама с собой, или одна таблица соединяется дважды с другой таблицей. При этом используются имена корреляции (алиасы, псевдонимы), которые позволяют различать соединяемые копии таблиц. Имена корреляции вводятся в разделе 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;
В результате получим следующую таблицу:
Иванов | 4 | Петров | 1 |
Иванов | 4 | Сидоров | 2 |
Сидоров | 2 | Петров | 1 |
Пример 20. Рассмотрим ситуацию, когда некоторые поставщики (назовем их контрагенты) могут выступать как в качестве поставщиков деталей, так и в качестве получателей. Таблицы, хранящие данные могут иметь следующий вид:
1 | Иванов |
2 | Петров |
3 | Сидоров |
Таблица 3 Отношение CONTRAGENTS
1 | Болт |
2 | Гайка |
3 | Винт |
Таблица 4 Отношение DETAILS (Детали)
1 | 2 | 1 | 100 |
1 | 3 | 2 | 200 |
1 | 3 | 3 | 300 |
2 | 3 | 1 | 150 |
2 | 3 | 2 | 250 |
3 | 1 | 1 | 1000 |
Таблица 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;
В результате получим следующую таблицу:
Иванов | Петров | Болт | 100 |
Иванов | Сидоров | Гайка | 200 |
Иванов | Сидоров | Винт | 300 |
Петров | Сидоров | Болт | 150 |
Петров | Сидоров | Гайка | 250 |
Сидоров | Иванов | Болт | 1000 |
SELECT P.NAME AS PNAME, C.NAME AS CNAME, DETAILS.DNAME, CD.VOLUME FROM CONTRAGENTS P, CONTRAGENTS C, DETAILS NATURAL JOIN CD WHERE P.NUM = CD.PNUM AND C.NUM = CD.CNUM;