从表 A 中获取不在表 B 中的记录

mda*_*nce 4 mysql sql logic

我是 SQL 新手,还无法正确执行此 SQL 查询。我目前有:

SELECT * FROM tableA
LEFT OUTER JOIN tableB
ON tableA.`full_name` = tableB.`full_name`
WHERE tableB.`id` IS NULL
Run Code Online (Sandbox Code Playgroud)

两个表都有人员记录,包括姓名和地址。我需要获取 tableA 中那些人的所有记录,而不是 tableB。下图基本上是我需要的:

文图

问题是两个人可能有相同的名字,但地址不同。所以最终,我需要获取 tableA 中所有人的记录,不包括具有重复名称和地址的重复项。

每个表都有如下列:

id,full_name,first_name,last_name,title,phone,address,city,state,postal_code
Run Code Online (Sandbox Code Playgroud)

Con*_*rix 7

由于您要加入两个字段,因此您的选择是 ANTI-JOIN (Friederike S 的答案) Not exists

SELECT DISTINCT tablea.* 
FROM   tablea 
WHERE  NOT EXISTS (SELECT * 
                   FROM   tableb 
                   WHERE  tablea.`full_name` = tableb.`full_name`
                          AND tableA.adress = tableB.adress) 
Run Code Online (Sandbox Code Playgroud)

演示版

您还可以使用not in查看(克里斯蒂安·阿默的)答案

另一个更晦涩的解决方案是使用ALL关键字。它非常类似于NOT IN

SELECT DISTINCT tablea.* 
FROM   tablea 
WHERE 

( tablea.`full_name`  , tableA.address) 

  !=  ALL (SELECT tableb.`full_name`, tableB.address 
           FROM tableb)
Run Code Online (Sandbox Code Playgroud)

演示版

  • @mdance 还有一点需要注意。根据所涉及列的可为空性,您将获得两者之间不同的性能特征。参见Quassnoi的文章[LEFT JOIN / IS NULL vs. NOT IN vs. NOT EXISTS: nullable columns](http://planet.mysql.com/entry/?id=24888) (2认同)

Fri*_*ike 6

以下查询将根据全名和地址为您提供 tableA 中不在 tableB 中的人员的所有 id:

SELECT tableA.id FROM tableA
LEFT OUTER JOIN tableB
-- people are the same if fullname and adress match
ON tableA.`full_name` = tableB.`full_name`
   AND tableA.adress = tableB.adress
-- filter people that re in tableA only
WHERE tableB.`id` IS NULL
-- filter duplicates
GROUP BY tableA.id
Run Code Online (Sandbox Code Playgroud)

您可以轻松编辑此 selet 以包含您需要的 tableA 中的任何信息。