SQL:使用多个条件查找不匹配的观察值

时间:2019-10-16 15:10:26

标签: sql ms-access

由于我对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);

1 个答案:

答案 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联接在一起,以获取首先没有匹配项的记录和姓氏。