由于我对SQL不太实用,因此我正在处理很可能是一个简单问题的问题。
我有两个表t1和t2,我需要在t2中查找尚未在t1中的观测值。这两个表格包含按姓名,姓氏,电子邮件地址列出的人员列表... 问题是我可以通过电子邮件地址匹配某些人,而其他一些人则使用姓名+姓氏,依此类推... 对于t1中的人,我需要将t2中的数字设置为1,然后需要t2中其他不匹配项的列表。
所以我已经完成了:
UPDATE t1, t2 SET t1.value = "1"
WHERE (t1.Mail In t2.Mail);
这似乎有效,但是当我尝试使用名称+姓氏时,它不起作用:
UPDATE t1, t2 SET t1.value = "1"
WHERE (t1.Name AND t1.Surname In t2.Name AND t2.Surname);
然后获得不匹配观察值的列表,我可以使用电子邮件找到不匹配的人,使用名称+姓氏找到不匹配的人,但是我想找到那些姓名和姓氏不匹配的人电子邮件地址不匹配的人。
我所做的:
SELECT t2.*
FROM t2 LEFT JOIN t1 ON t2.Mail = t1.Mail
WHERE (t1.Mail Is Null);
和
SELECT t2.*
FROM t2
LEFT JOIN t1 ON t2.Surname = t1.Surname AND t2.Name = t1.Name
WHERE (t1.ID is Null);
答案 0 :(得分:0)
您当前的update
查询正在使用cross join or cartesian product引用这些表,即:对于第一个表中的每个记录,该查询将遍历第二个表中的每个记录,并且所有匹配都将发生通过使用where
子句条件。
在使用left/right/inner joins
的第二组示例中,当可以使用left join
时,这通常被认为是不好的做法。
这样,假设我已正确理解您的数据,我可能会提出以下建议:
update t1 inner join t2 on t1.mail = t2.mail set t1.value = "1"
update t1 inner join t2 on t1.name = t2.name and t1.surname = t2.surname set t1.value = "1"
关于第二个问题:
...我想找到姓名+电子邮件地址不匹配的人。
您可以按照以下方式使用某些内容:
select q.*
from
(
select t2.* from t2 left join t1 on t2.mail = t1.mail
where t1.mail is null
) q
left join t1 on q.name = t1.name and q.surname = t1.surname
where
t1.name is null
这使用子查询来获取电子邮件地址不匹配的初始记录集,然后左键将此子查询的结果与表t1
联接在一起,以获取首先没有匹配项的记录和姓氏。