Объединение наборов данных
Вторая команда в листинге 4.38 использует внешнее объединение и возвращает 20 записей. У трех записей в итоговом наборе отсутствуют коды ISBN, но эти записи все равно включаются в результат.
Листинг 4.38. Внутренние и внешние объединения.
booktown=# SELECT title, isbn booktown-# FROM books INNER JOIN editions booktown-# ON (books.id = editions.book_id); title | isbn The Tell-Tale Heart | 1885418035 The Tell-Tale Heart | 0929605942 Little Women | 0760720002 The Velveteen Rabbit | 0679803335 Goodnight Moon | 0694003611 Bartholomew and the Oobleck | 0394800753 The Cat in the Hat | 039480001X The Cat in the Hat | 0394900014 Dynamic Anatomy | 0823015505 2001: A Space Odyssey | 0451457994 2001: A Space Odyssey | 0451198492 Dune | 0441172717 Dune | 044100590X The Shining | 0451160916 The Shining | 0385121679 Franklin in the Dark | 0590445065 Programming Python | 0596000855 (17 rows) booktown=# SELECT title, isbn booktown-# FROM books LEFT OUTER JOIN editions booktown-# ON (books.id = editions.book_id); title | bisbn The Tell-Tale Heart | 1885418035 The Tell-Tale Heart | 0929605942 Little Women | 0760720002 The Velveteen Rabbit | 0679803335 Goodnight Moon | 0694003611 Bartholomew and the Oobleck | 0394800753 The Cat in the Hat | 039480001X The Cat in the Hat | 0394900014 Dynamic Anatomy | 0823015505 2001: A Space Odyssey | 0451457994 2001: A Space Odyssey | 0451198492 Dune | 0441172717 Dune | 044100590X The Shining | 0451160916 The Shining | 0385121679 Franklin in the Dark | 0590445065 Practical PostgreSQL Programming Python | 0596000855 Learning Python Perl | Cookbook (20 rows)
Во второй команде, приведенной в листинге 4.38, использовано левое внешнее объединение (LEFT OUTER JOIN). Выбор объясняется тем, что запрос должен вернуть названия книг, для которых существуют (или не существуют) коды ISBN. Поскольку таблица books стоит слева от ключевого слова JOIN, задача решается при помощи левого внешнего объединения. Если бы помимо названий, не имеющих кодов ISBN, нас интересовали коды ISBN, не имеющие названий, следовало бы воспользоваться полным внешним запросом FULL OUTER JOIN.
Различия между внутренними и внешними объединениями, продемонстрированные в листинге 4.38, чрезвычайно важны, поскольку неправильный выбор объединения приводит к получению лишней информации или потере нужных данных.
Примечание
Ключевое слово OUTER во внешних объединениях PostgreSQL является необязательным. Определения LEFT JOIN, RIGHT JOIN и FULL JOIN подразумевают внешнее объединение.