从表A中获取表B中没有的记录

时间:2013-05-30 19:19:00

标签: mysql sql logic

我是SQL的新手,还没有能够正确获取这个SQL查询。我目前有:

SELECT * FROM tableA
LEFT OUTER JOIN tableB
ON tableA.`full_name` = tableB.`full_name`
WHERE tableB.`id` IS NULL

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

Ven Diagram

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

每个表都有如下列:

id,full_name,first_name,last_name,title,phone,address,city,state,postal_code

5 个答案:

答案 0 :(得分:4)

以下查询将根据全名和地址为您提供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

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

答案 1 :(得分:4)

由于您加入了两个字段,因此您可以选择ANTI-JOIN (Friederike S' answer) 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) 

DEMO

您还可以使用not in查看(Christian Ammer's)回答

另一个更加模糊的解决方案是使用ALL关键字。它与NOT IN

非常相似
SELECT DISTINCT tablea.* 
FROM   tablea 
WHERE 

( tablea.`full_name`  , tableA.address) 

  !=  ALL (SELECT tableb.`full_name`, tableB.address 
           FROM tableb)

DEMO

答案 2 :(得分:3)

在我看来,使用子查询而不是JOIN编写这样的查询是合乎逻辑的。因为它是一个非相关的子查询,所以JOIN版本不应该有性能差异。

SELECT *
FROM tableA
WHERE (full_name, address) NOT IN
(SELECT full_name, address FROM tableB);

您可以在SQL Fiddle上查看结果。

还看看这个答案:

答案 3 :(得分:0)

你检查过这个优秀的页面吗? http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

答案 4 :(得分:0)

您可以使用NOT EXIST子句。此条件将返回tableA中所有记录,其中tableB中没有给定full_name的记录。

   SELECT * FROM 
   tableA
   WHERE 
   NOT EXISTS (select * from tableB Where tableA.full_name = tableB.full_name);