【发布时间】:2020-10-15 03:31:06
【问题描述】:
我有一个user 表和一个item 表,我可以在其中为每个用户分配多个项目。我需要一个简单的查询,它将选择所有没有分配特定类型项目的用户。
我的查询的问题是,如果某个用户分配了多个项目,比如 100、200 和 300,他们仍然会被选中,因为他们分配了类型为 100 和 200 的项目。我想要的是完全排除所有已分配项目 300 的用户,而不管他们可能已分配的任何其他项目。
我发现类似的 question 有答案,但它处理不同的关系类型 (MtM),我在将答案翻译为我的特定案例时遇到了问题。
我的不完整查询需要扩展
SELECT * FROM user
LEFT JOIN item
ON user.id = item.assigned_to_id
WHERE item.id is null OR item.type != 300
查询正常,但有一个子查询,我想避免这种情况
SELECT * FROM user
WHERE user.id NOT IN
(
SELECT i.assigned_to_id
FROM item i
WHERE i.type = 300
AND i.assigned_to_id is not null
)
【问题讨论】:
-
请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格格式作为代码输入。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。
-
这是一个常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。如果您发布问题,请使用一个措辞作为标题。
-
@AkhileshMishra 在代码字体用于非代码的情况下,阅读材料很快就会变得困难,即在阅读时碰巧出现在代码中的单词/名称不是代码,而仅仅是命名事物。而且这种风格是用还是用,完全是个人喜好问题,编辑别人的帖子这样做是不合适的;如果一个这样的编辑是合理的,那么每个帖子都可以不断地在风格之间来回编辑。因此,请将您的风格选择保留在您自己的帖子中,并以自己的风格保留帖子。代码使用代码字体。
-
永远不要使用邪恶的
SELECT *。相反,只命名和限定您实际希望返回的列。