查找两个具有相同字段的表之间未共享的SQL行

时间:2010-09-04 02:04:48

标签: sql

我有两个具有相同字段的表,它们共享许多行。我想列出一个表中的所有行,这些行在另一个表中无法匹配。具体来说,这两个表是实验的两个不同版本,其结果略有不同。一个例子是这样的:

|TableA|
--------
horse
cat
cow
table

|TableB|
--------
horse
cat
chair

我希望TableA能够chair TableB TableB cow table TableA {{1}} {{1}}已遗漏{{1}}。

我的想法是在所有字段上进行某种外连接,然后将其中带有空值的行排序,但这似乎很重要。这是要走的路还是有更优雅/有效的方法?

3 个答案:

答案 0 :(得分:12)

使用NOT IN:

SELECT a.column
  FROM TABLE_A a
 WHERE a.column NOT IN (SELECT b.column
                          FROM TABLE_B b)

使用NOT EXISTS:

如果您需要比较多个列,这是一个很好的...

SELECT a.column
  FROM TABLE_A a
 WHERE NOT EXISTS(SELECT NULL
                    FROM TABLE_B b
                   WHERE b.column = a.column)

使用LEFT JOIN / IS NULL:

   SELECT a.column
     FROM TABLE_A a
LEFT JOIN TABLE_B b ON b.column = a.column
    WHERE b.column IS NULL

由于表别名,您可以交换表名而不更改查询的其余部分,以查看相反的 - TABLE_B中不在TABLE_A中的行。

答案 1 :(得分:0)

在为NULLABLE列使用IN子句时要注意

答案 2 :(得分:0)

如果您要列出左表而不是右表中的所有行以及右表而不是左表中的所有行:

CREATE TABLE test1 (
idOne int identity primary key
,nameOne nvarchar (3) 
)
CREATE TABLE test2 (
idTwo int identity primary key
,nameTwo nvarchar (3) 
)
INSERT INTO test1 (nameOne) VALUES
('one'),
('two'),
('thr')
INSERT INTO test2 (nameTwo) VALUES
('one'),
('tre')

SELECT 'test2 row', idOne, nameOne, idTwo, nameTwo FROM test1 t1
RIGHT JOIN test2 t2 ON
t1.idOne = t2.idTwo and 
t1.nameOne = t2.nameTwo
WHERE idONE is NULL
OR idTwo is NULL
UNION ALL 
SELECT 'test1 row', idOne, nameOne, idTwo, nameTwo FROM test1 t1
LEFT JOIN test2 t2 ON
t1.idOne = t2.idTwo and 
t1.nameOne = t2.nameTwo
WHERE idOne is NULL
OR idTwo is NULL