首页 > 解决方案 > 使用 PostgreSQL 中的链接表进行 LEFT JOIN

问题描述

有表people和。我想要列表中的所有人,但不是每个人都有一本书,所以我使用 a链接到,但链接到书籍不应该是 a 。 people_has_bookbooksLEFT JOINpeoplepeople_has_bookpeople_has_bookLEFT JOIN

我该怎么做?

标签: sqlpostgresqlleft-join

解决方案


您可以使用括号来确定连接的优先级。喜欢:

SELECT *
FROM   people p
LEFT   JOIN ( people_has_book pb JOIN books b USING (book_id) ) USING (people_id);

这与两个s略有不同:LEFT JOIN

SELECT *
FROM   people p
LEFT   JOIN people_has_book pb USING (people_id)
LEFT   JOIN books b USING (book_id);

后者将显示来自的行,people_has_book即使books. 但是,在具有强制引用完整性的 FK 约束的经典多对多实现中,对于您的特定查询通常没有有效的区别,因为无论如何都people_has_book.book_id必须引用现有行books- 除了 NULL 值的奇异例外。(如果(people_id, book_id)是 的 PK people_has_book,则两列都是NOT NULL自动的。)

有关的:


推荐阅读