我正在编写 C# 应用程序并使用 Access .mdb。我有一个包含电子邮件的表和一个包含消息关系的表(每个电子邮件消息都可以分配给多个工作团队)。
我想从第一个表中获取未分配给任何团队的消息 - 即,在第二个表中没有条目或条目为空。它适用于空条目,但不会返回根本没有该分配条目的行。
我正在使用以下查询:
SELECT TOP 10 Mails.*
FROM Mails INNER JOIN MailAssignments ON Mails.msgId = MailAssignments.msgId
WHERE (Mails.msgId <= ?)
AND
(Mails.msgId NOT IN (SELECT msgId FROM MailAssignments))
OR (MailAssignments.forTeam IS NULL)
OR (MailAssignments.forTeam = '')
更新:
我需要使用某种 JOIN,因为在某些情况下,查询还应该返回在另一个表中具有关系的行(例如,当有人想要显示来自他们团队的消息和未分配的消息时)。
更新:
好吧,我想我可以通过从第二个表中删除任何分配来简化它,这样我就不需要检查空分配,只检查根本不存在的分配。但有时我仍然需要显示已分配的数据以及未分配的数据。我需要为只会更改不同参数的查询构建一个查询:/
更新/解决方案:
我做了一些更多的调整,但 LEFT JOIN 基本上帮了我!伙计们,感谢您的提示和所有帮助!
最佳答案
这应该足够了:
SELECT TOP 10 Mails.*
FROM Mails
WHERE (Mails.msgId <= ?)
AND
(Mails.msgId NOT IN (SELECT msgId FROM MailAssignments))
阅读您的描述,您似乎在 MailAssignments
中有与 Mails
相关的行,但尚未真正分配团队(forTeam
列有一个空字符串。这不是好的设计,但在这种情况下,请使用:
SELECT TOP 10 Mails.*
FROM Mails
LEFT JOIN
MailAssignments ON Mails.msgId = MailAssignments.msgId
WHERE (Mails.msgId <= ?)
AND ( (MailAssignments.forTeam IS NULL)
OR (MailAssignments.forTeam = '')
)
关于c# - SQL:选择在另一个表中没有关系的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9632645/