sql - 使用 PostgreSQL 中的链接表进行 LEFT JOIN
问题描述
有表people
和。我想要列表中的所有人,但不是每个人都有一本书,所以我使用 a链接到,但链接到书籍不应该是 a 。 people_has_book
books
LEFT JOIN
people
people_has_book
people_has_book
LEFT 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
自动的。)
有关的:
推荐阅读
- c++ - 如何使用 Visual Studio 编译器使用 cgo 构建库?
- r - 如何读取“.TAB”文件
- php - Laravel 5.x - Eloquent 模型如何成为 QueryBuilder?
- postgresql - 如何获取从 1 到 10 和从 11 到 20 值的列表(postgres)
- tensorflow - 如何在tensorflow的model_with_buckets中使用sampled_softmax_loss函数?
- spring - Spring WebSocket 出错
- python - 如何将整数添加到列表中的现有整数?
- r - 对相同的列表元素进行分组并计算其在 R 中的出现次数
- traefik - 使 Traefik 以 JSON 格式返回错误
- c++ - gcc 中的默认构造内联静态随机数引擎