使用Join解析重复数据

时间:2011-11-26 23:05:31

标签: sql sql-server tsql

我在下面的语句中遇到了一些问题,使用表格:

[Users] Name,Email,Subscribed 
[Email] Name,Email,Subscribed

基本上需要完成的是Users表中的所有订阅用户需要针对Email表中的用户进行检查,以查看它们是否存在于表中,并且仅返回Users表中未在电子邮件表中找到的用户。

这是我使用过的语句,但是它返回了数百万行并且需要永久,并且它返回了电子邮件表中的每个电子邮件地址,我不认为这是解决此问题的最佳方法,因为它没有返回准确的数据。有什么想法吗?

SELECT Distinct c.Name,c.Email from Users c 
INNER JOIN Email e on c.Email <> e.Email
WHERE c.Subscribed=1

3 个答案:

答案 0 :(得分:0)

更改&lt;&gt;到=

您正在进行不相等的联接,这就是您的结果大小爆炸的原因。

在旁注 - 检查未来的外键 - 他们使这种类型的交叉表引用完整性不是问题。

更新 - 如果您希望一个表中的结果不在另一个表中,请执行以下操作:

select * from table1 where email not in (select distinct email from table2);

这将为您提供table1中与表2中的电子邮件不匹配的所有记录。

HTH

答案 1 :(得分:0)

我认为这就是你要找的东西。

   SELECT c.Name,c.Email 
   FROM Users c  LEFT JOIN Email e ON (c.email=e.email)
   WHERE (e.email is null) and (c.subscribed=1)

查询中没有ON子句的INNER JOIN就是你得到古怪结果的原因。

答案 2 :(得分:0)

您需要使用LEFT JOIN来完成此操作:

SELECT Distinct u.Name, u.Email
FROM Users AS u 
LEFT JOIN Email AS e ON u.Email = e.Email
WHERE e.Email IS NULL
   AND u.Subscribed = 1

JOINS的图形说明可能会有所帮助

我强烈建议您使用Foreign Keys来维护参照完整性。