SQLсервер в Linux -самостоятельное освоение пакета

       

Внутренние и внешние объединения



Листинг 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, чрезвычайно важны, поскольку неправильный выбор объединения приводит к получению лишней информации или потере нужных данных.

Примечание 1
Примечание 1

Ключевое слово OUTER во внешних объединениях PostgreSQL является необязательным. Определения LEFT JOIN, RIGHT JOIN и FULL JOIN подразумевают внешнее объединение.



Содержание раздела