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