c# - SQL:选择在另一个表中没有关系的数据

标签 c# sql ms-access

我正在编写 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/

相关文章:

c# - 长时间运行的任务与线程——性能

mysql - 匹配关系最多的条目

mysql - 如何将 Access 2003 数据库链接到 MySQL 数据库

python - 如何在 python 中使用 SQL 时移动值

ms-access - 在 MS Access 中运行一系列查询时如何在状态栏上显示进度

sql - Access SQL语法错误: missing operator

c# - 处理 Outlook 加载项中的附件事件

c# - 以 WebBrowser 窗体(Windows 窗体 C#)完全加载页面时的 DocumentCompleted 事件

c# - 通过 JavaScript 将值分配给 Asp.net 标签,然后通过 C# session 对象传递时出现问题

mysql - 如何在 SQL 中舍入一个值?