我是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
答案 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)
您还可以使用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)
答案 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);