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基本上为我做到了!谢谢你们的提示和帮助,伙计们!

SQL:选择没有';我在另一张桌子上没有亲戚关系

这应该足够了:

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。