Сравнение наборов записей
Если объединения используются в SQL для слияния полей двух источников, то ключевые слова UNION, INTERSECT и EXCEPT сравнивают значения полей в двух наборах и строят новый итоговый набор на основании результатов сравнения. Каждое из перечисленных ключевых слов может использоваться в конце синтаксически правильного запроса SQL, а за ним может следовать второй запрос; в этом случае итоговые наборы двух запросов сравниваются и записи либо включаются в результат, либо игнорируются.
Сравниваемые наборы данных должны содержать одинаковое количество полей, относящихся к соответствующим типам. При этом не требуется, чтобы поля имели одинаковые имена или принадлежали к одной таблице или источнику данных.
- UNION. Все различающиеся записи двух наборов включаются в один набор данных. Совпадающие записи не дублируются.
- INTERSECT. Все записи, не входящие в оба набора данных, игнорируются. Таким образом, результат состоит только из записей, присутствующих в обоих наборах.
- EXCEPT. Все записи, входящие в оба набора данных, игнорируются. Таким образом, результат состоит только из тех записей набора, указанного слева от ключевого слова EXCEPT, которые не входят в набор, указанный справа от него.
В листингах 4.46-4.48 показаны результаты применения этих операций к двум наборам данных. В листинге 4.46 итоговый набор формируется слиянием фамилий авторов с названиями книг, для чего используется ключевое слово UNION.
В листинге 4.47 продемонстрирована выборка кодов ISBN из таблицы editions. Выборка ограничивается записями, которые упоминаются более чем в двух поставках в таблице shipments. Наконец, в листинге 4.48 из первого запроса исключаются все записи, входящие во второй запрос.
Листинг 4.46. Использование секции UNION.
booktown=# SELECT title FROM books booktown-# UNION booktown-# SELECT last_name FROM authors booktown-# LIMIT 11; title 2001: A Space Odyssey Alcott Bartholomew and the Oobleck Bianco Bourgeois Brautigan Brite Brown Christiansen Clarke Denham (11 rows)
Листинг 4.47. Использование секции INTERSECT.
booktown=# SELECT isbn FROM editions booktown-# INTERSECT booktown-# SELECT isbn FROM shipments booktown-# GROUP BY isbn booktown-# HAVING count(id) > 2; isbn 039480001X 0394800753 0451160916 0590445065 0694003611 (5 rows)