Объединение наборов данных
Сложные объединения
Хотя одна секция JOIN объединяет всего два набора данных, на практике объединения не ограничиваются двумя источниками. За набором, созданным посредством объединения, может следовать новая секция JOIN – по аналогии с тем, как перечисляются через запятую источники данных.
Элементы комбинированных объединений рекомендуется заключать в круглые скобки. Явная группировка гарантирует отсутствие неоднозначности (как для PostgreSQL, так и для разработчика) относительно того, какие наборы и в каком порядке объединяются. Пример объединения нескольких источников данных приведен в листинге 4.39.
Листинг 4.39. Объединение нескольких источников данных.
booktown=# SELECT a.last_name, p.name AS publisher, e.isbn, s.subject booktown-# FROM ((((authors AS a INNER JOIN books AS b</userinput> booktown(# ON (a.id = b.author_id))</userinput> booktown(# INNER JOIN editions AS e ON (e.book_id = b.id)) booktown(# INNER JOIN publishers AS p ON (p.id = e.publisher_id)) booktown(# INNER JOIN subjects AS s ON (s.id = b.subjected)); last_name | publisher | isbn | subject Hogarth | Watson-Guptill Publications | 0823015505 | Arts Brown | HarperCollins | 0694003611 | Children's Books Geisel | Random House | 0394800753 | Children's Books Geisel | Random House | 039480001X | Children's Books Geisel | Random House | 0394900014 | Children's Books Bourgeois | Kids Can Press | 0590445065 | Children's Books Bianco | Penguin | 0679803335 | Classics Lutz | O'Reilly & Associates | 0596000855 | Computers Alcott | Henry Holt & Company. Inc. | 0760720002 | Drama Рое | Mojo Press | 1885418035 | Horror Рое | Books of Wonder | 0929605942 | Horror King | Doubleday | 0451160916 | Horror King | Doubleday | 0385121679 | Horror Clarke | Roc | 0451457994 | Science Fiction Clarke | Roc | 0451198492 | Science Fiction Herbert | Ace Books | 0441172717 | Science Fiction Herbert | Ace Books | 044100590X | Science Fiction (17 rows)
В листинге 4.39 можно заметить одно любопытное обстоятельство: хотя таблица books участвует в объединении, ни одно из ее полей не входит в итоговый набор. Включение таблицы books в секции JOIN предоставляет критерии для объединения других таблиц. Все таблицы, поля которых возвращаются в результате запроса, связываются с другими таблицами через поле id таблицы books (кроме таблицы publishers, которая связывается с таблицей editions по полю publisher_id).