rof*_*lol 1 sql postgresql outer-join
假设我有两个表,可能有也可能没有关系.例如,书籍和标签.所以,假设我想选择没有"Sci-Fi"标签的书籍,我会写这样的东西:
SELECT
*
FROM
books
LEFT OUTER JOIN
tags ON books.id = tags.taggable_id
WHERE
tags.name NOT IN ('Sci-Fi')
Run Code Online (Sandbox Code Playgroud)
我没想到这也会排除没有标签的书籍.我试过这个:
WHERE
tags.name IN (NULL, 'Novel'...)
Run Code Online (Sandbox Code Playgroud)
最后得到了这个,我很确定不是最好的方法:
WHERE
tags.name NOT IN ('Sci-Fi') OR tags.id IS NULL
Run Code Online (Sandbox Code Playgroud)
问题是为什么,还有另一种方式吗?
PS不会问为什么标签是这样创建的,它只是为了举例而且这是我设法挤出自己的最佳类比:)
该where子句中的所有条件都会过滤结果数据.所以把Sci-Fi条件放在join条款上
SELECT *
FROM books
LEFT OUTER JOIN tags ON books.id = tags.taggable_id
AND tags.name NOT IN ('Sci-Fi')
WHERE tags.id IS NULL
Run Code Online (Sandbox Code Playgroud)
要获得可以拥有多个标签并且根本不应具有科幻标签的书籍,您可以这样做
SELECT books.id, books.name
FROM books
LEFT OUTER JOIN tags ON books.id = tags.taggable_id
GROUP BY books.id, books.name
HAVING sum(case when tags.name = 'Sci-Fi' then 1 else 0 end) = 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40 次 |
| 最近记录: |