4

我是 SQL 的新手,还不能正确地得到这个 SQL 查询。我目前有:

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

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

文图

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

每个表的列如下:

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

5 回答 5

7

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

您可以轻松地编辑此选择以包含您需要的来自 tableA 的任何信息。

于 2013-05-30T19:24:38.057 回答
5

由于您要加入两个领域,因此您的选择是 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) 

演示

您也可以使用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)

演示

于 2013-05-30T20:03:24.273 回答
3

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

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

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

也看看这个答案:

于 2013-05-30T21:28:50.553 回答
0

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

   SELECT * FROM 
   tableA
   WHERE 
   NOT EXISTS (select * from tableB Where tableA.full_name = tableB.full_name);
于 2013-05-30T20:09:19.153 回答
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
于 2013-05-30T19:26:18.230 回答