Sql 从表A中选择,但排除表B中存在匹配项的位置

Sql 从表A中选择,但排除表B中存在匹配项的位置,sql,join,Sql,Join,我有两个表,订阅者和发送日志。我需要在Sendlog表中选择所有订阅服务器,但排除符合我的条件的记录 标准是他们是“超级用户”,SubscribePreference=1,并且从未收到过“GoPro”电子邮件 我在这里有一个SQL FIDLE来表示它,但无法理解查询 在这个示例中,我想返回Dave,Ed&Frank,因为他们从未收到过“GoPro”电子邮件 有人能帮我吗?这应该可以: SELECT DISTINCT s.EmailAddress , 'GoPro' AS Campaign

我有两个表,订阅者和发送日志。我需要在Sendlog表中选择所有订阅服务器,但排除符合我的条件的记录

标准是他们是“超级用户”,SubscribePreference=1,并且从未收到过“GoPro”电子邮件

我在这里有一个SQL FIDLE来表示它,但无法理解查询

在这个示例中,我想返回Dave,Ed&Frank,因为他们从未收到过“GoPro”电子邮件

有人能帮我吗?

这应该可以:

SELECT DISTINCT s.EmailAddress
   , 'GoPro' AS CampaignName
  , sl.SendDate
FROM Subscribers s 
LEFT JOIN SendLog sl 
  ON s.EmailAddress = sl.EmailAddress
  AND CampaignName = 'GoPro'
WHERE s.Entitlement = 'PowerUser' 
AND s.SubscribePreference = 1
AND sl.EmailAddress IS NULL

这应该可以:

SELECT DISTINCT s.EmailAddress
   , 'GoPro' AS CampaignName
  , sl.SendDate
FROM Subscribers s 
LEFT JOIN SendLog sl 
  ON s.EmailAddress = sl.EmailAddress
  AND CampaignName = 'GoPro'
WHERE s.Entitlement = 'PowerUser' 
AND s.SubscribePreference = 1
AND sl.EmailAddress IS NULL

我相信这会奏效:

SELECT DISTINCT Subscribers.EmailAddress
FROM   Subscribers
LEFT OUTER JOIN SendLog
       ON Subscribers.EmailAddress = SendLog.EmailAddress
       AND SendLog.CampaignName = 'GoPro'
WHERE  SendLog.EmailAddress IS NULL
       AND Subscribers.SubscribePreference = 1
       And Subscribers.Entitlement = 'PowerUser'

出于性能原因,我建议在Subscribers表中添加一个ID列作为主键,然后在SendLog表中创建一个名为SubscriberID的外键,并在该外键上加入它们。上面的查询可以工作,但使用整数和适当的键会更快。

我相信这会工作:

SELECT DISTINCT Subscribers.EmailAddress
FROM   Subscribers
LEFT OUTER JOIN SendLog
       ON Subscribers.EmailAddress = SendLog.EmailAddress
       AND SendLog.CampaignName = 'GoPro'
WHERE  SendLog.EmailAddress IS NULL
       AND Subscribers.SubscribePreference = 1
       And Subscribers.Entitlement = 'PowerUser'
出于性能原因,我建议在Subscribers表中添加一个ID列作为主键,然后在SendLog表中创建一个名为SubscriberID的外键,并在该外键上加入它们。上面的查询可以工作,但是使用整数和适当的键会更快