SQL:选择没有';我在另一张桌子上没有亲戚关系
本文关键字:一张 关系 选择 SQL | 更新日期: 2023-09-27 18:27:25
我正在编写一个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 = '')
)
将Mails
加入MailAssignments
的子集,尝试将邮件与现有分配进行匹配(其中forTeam <> ''
),并选择未进行匹配的邮件:
SELECT TOP 10
Mails.*
FROM Mails
LEFT JOIN MailAssignments ON Mails.msgId = MailAssignments.msgId
AND MailAssignments.forTeam <> ''
WHERE Mails.msgId <= ?
AND MailAssignments.msgId IS NULL /* either no match for this mail at all
or no match with an existing assignment
– so, just no match */
因为您使用了联接,我想您需要第二个表中的列,所以使用OUTER JOIN
而不是INNER JOIN
(它返回表中没有匹配项的条目)。
如果你不需要它们,我同意@ypercube。