我在下面的语句中遇到了一些问题,使用表格:
[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
答案 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来维护参照完整性。