使用SQL联接获取未预期的数据

使用SQL联接获取未预期的数据,sql,join,Sql,Join,这似乎是一个基本问题,但我有一个SQL问题。我有两个表,YesterdayData,和\u ListSubscribers。它们都有一个共同的主键,可以在SubscriberKey上加入。但是,我只想返回YesterdayData中数据与\u ListSubscribers不匹配的行(而不是\u ListSubscribers中不存在的行) 这是我到目前为止得到的结果,但它返回的行比预期的多: SELECT DISTINCT y.ListName, y.Status, y.ListID, y.S

这似乎是一个基本问题,但我有一个SQL问题。我有两个表,
YesterdayData
,和
\u ListSubscribers
。它们都有一个共同的
主键
,可以在SubscriberKey上加入。但是,我只想返回
YesterdayData
中数据与
\u ListSubscribers
不匹配的行(而不是
\u ListSubscribers
中不存在的行)

这是我到目前为止得到的结果,但它返回的行比预期的多:

SELECT DISTINCT
y.ListName,
y.Status,
y.ListID,
y.SubscriberKey,
y.AddMethod
FROM _Listsubscribers l
LEFT JOIN YesterdayData y
ON y.subscriberkey = l.subscriberkey
WHERE l.Status != y.Status
非常感谢! 格雷格

更新-谢谢大家的帮助。我相信这解决了问题:

SELECT
l.ListName,
l.Status,
l.ListID,
l.SubscriberKey,
l.AddMethod
FROM _Listsubscribers l
LEFT JOIN YesterdayData y
ON y.subscriberkey = l.subscriberkey
WHERE l.Status != y.Status
AND y.ListID = l.ListID
添加ListID条件(另一个主键)似乎已经修复了它

再次感谢您的帮助

试试这个

选择
y、 列表名,
y、 地位,
y、 ListID,
y、 贝基,
y、 添加方法
来自
右键连接昨天的数据
关于y.subscriberkey=l.subscriberkey
l.状态在哪里!=y、 地位
尝试内部联接

SELECT DISTINCT
y.ListName,
y.Status,
y.ListID,
y.SubscriberKey,
y.AddMethod
FROM _Listsubscribers l
INNER JOIN YesterdayData y
ON y.subscriberkey = l.subscriberkey AND l.Status != y.Status

您可以完全加入以获得所需的结果集,如下所示-

SELECT DISTINCT
y.ListName,
y.Status,
y.ListID,
y.SubscriberKey,
y.AddMethod
FROM _Listsubscribers l
FULL JOIN YesterdayData y
ON y.subscriberkey = l.subscriberkey
WHERE y.subscriberkey IS NULL OR  l.subscriberkey IS NULL

您正在搜索
\u Listsubscribers
,其中确实存在任何(我的意思是any
YesterdayData
项,其状态不同。您需要在
\u列表订阅者
中查找不匹配的
昨天数据
记录:

SELECT DISTINCT
y.ListName,
y.Status,
y.ListID,
y.SubscriberKey,
y.AddMethod
FROM _Listsubscribers l
LEFT JOIN YesterdayData y
ON y.subscriberkey = l.subscriberkey
WHERE l.Status != y.Status
试着这样做:

select y.ListName, y.Status, y.ListID, y.SubscriberKey, y.AddMethod
from YesterdayData y
where not exists (select 1 from _Listsubscribers l where l.Status = y.Status)
说明:如果A和B集合中至少有一条B记录与A的给定记录不匹配,则A的给定记录将出现在结果中,而不管它是否与B匹配


有骑马的人和马。我们想知道一个没有马的骑马者。如果至少有一匹马不是他的,那么你已经做了类似于搜索骑手的事情。如果每个骑手至少有一匹这样的马,那么所有骑手都将被视为没有马,无论他们是否有马。

帮助我们帮助您-请共享表格结构、一些示例数据、,以及您尝试获取此示例的结果。是否要返回_ListSubscriber记录,这些记录位于昨天数据中,但状态相同?如果没有,那么如果您使用了错误的连接,请使用常规连接(内部)而不是左连接。您好,感谢您的回复。我想返回昨天数据中的所有记录,这些记录的值与_ListSubscribers中的值不同。了解左连接返回的内容:行上的内部连接UNION所有不匹配的左表行均由NULL扩展。始终知道作为外部联接的一部分,您需要什么样的内部联接。上的WHERE或内部联接,在上的外部联接删除任何由NULL扩展的行后,要求右[sic]表列不为NULL,即在行上只保留内部联接,即“将外部联接转换为内部联接”。你有。PS“更多行”是因为您希望输入行对“具有不匹配的数据”,但与其他数据匹配——但您忘记将其添加到ON。PS通过编辑而不是注释进行澄清。因此,您的代码目前正在为相同的
SubscriberKey
查找行,其中
状态不同。如果这是您想要的,那么假设
SubscriberKey
是您所说的公共主键,那么您的帖子中的查询应该是好的。但是,如果同一个人订阅了多个列表,那么表中的行是否仍具有相同的
SubscriberKey
?如果是这样,那么该字段毕竟不是这些表的主键,您需要在
上展开
,以包含其他PK字段。在发布之前,请查看编辑框下方的帖子格式版本。阅读“编辑帮助”“重新内联和块格式”中的代码和引用。请合理设置代码格式。请解释你的帖子是如何解决这个问题的。好的,很抱歉给你带来不便。这个问题不清楚,但完全加入与所写内容不一致。此外,并不是所有的SQL都有完全连接,所以您不知道这是否合适,所以请先发表评论以澄清。