【发布时间】:2016-01-28 00:52:06
【问题描述】:
假设我有两个表,它们可能有关系,也可能没有关系。例如,书籍和标签。所以,假设我要选择没有标签“Sci-Fi”的书籍,我会这样写:
SELECT
*
FROM
books
LEFT OUTER JOIN
tags ON books.id = tags.taggable_id
WHERE
tags.name NOT IN ('Sci-Fi')
我没想到这也会排除完全没有标签的书籍。 我试过这个:
WHERE
tags.name IN (NULL, 'Novel'...)
最后得到了这个,我很确定这不是最好的方法:
WHERE
tags.name NOT IN ('Sci-Fi') OR tags.id IS NULL
问题是为什么,还有其他方法吗?
附:不要问为什么以这种方式创建标签,这只是为了举例,这是我设法从自己身上挤出的最好的比喻:)
【问题讨论】:
-
只是备注:这不会选择“没有标签'Sci-Fi'的书”,而是选择所有标签除'Sci-Fi'以外的所有书。要执行前者,您将使用
NOT EXISTS而不是加入表格。 -
说'我想选择没有标签“科幻”的书'我的意思是我对没有标签的书也很感兴趣。两个答案建议将条件 tags.name NOT IN ('Sci-Fi') 移动到 JOIN 子句,但据我所知,这只会使标签字段为空,但仍会选择具有 Sci-Fi 标签的书籍。
-
不,我的意思是:您不是在选择书籍,而是在选择书籍标签组合。
-
哦,好吧,那么:)我会考虑这个,但我需要'join-way',因为我正在使用rails并寻找一种方法来使用AR而不是纯sql来做到这一点: )
-
您想要没有特定标签的书籍,还是想要没有任何更大标签的书籍?因为仅针对列表中的一个值执行此操作的最清晰方法不涉及
NOT IN。 (看起来您可能使用NOT IN只是因为您认为它在<>不起作用时有效。)您希望结果中的哪些列?
标签: sql postgresql outer-join