我有两个具有相同字段的表,它们共享许多行。我想列出一个表中的所有行,这些行在另一个表中无法匹配。具体来说,这两个表是实验的两个不同版本,其结果略有不同。一个例子是这样的:
|TableA|
--------
horse
cat
cow
table
|TableB|
--------
horse
cat
chair
我希望TableA
能够chair
TableB
TableB
cow
table
TableA
{{1}} {{1}}已遗漏{{1}}。
我的想法是在所有字段上进行某种外连接,然后将其中带有空值的行排序,但这似乎很重要。这是要走的路还是有更优雅/有效的方法?
答案 0 :(得分:12)
SELECT a.column
FROM TABLE_A a
WHERE a.column NOT IN (SELECT b.column
FROM TABLE_B b)
如果您需要比较多个列,这是一个很好的...
SELECT a.column
FROM TABLE_A a
WHERE NOT EXISTS(SELECT NULL
FROM TABLE_B b
WHERE b.column = a.column)
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