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

Ric*_*ich 2 sql

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

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

|TableB|
--------
horse
cat
chair
Run Code Online (Sandbox Code Playgroud)

我希望能够看到,TableA缺少chairTableB,并可能在不同的查询TableB缺失cowtable从失踪TableA.

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

OMG*_*ies 12

使用NOT IN:

SELECT a.column
  FROM TABLE_A a
 WHERE a.column NOT IN (SELECT b.column
                          FROM TABLE_B b)
Run Code Online (Sandbox Code Playgroud)

使用NOT EXISTS:

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

SELECT a.column
  FROM TABLE_A a
 WHERE NOT EXISTS(SELECT NULL
                    FROM TABLE_B b
                   WHERE b.column = a.column)
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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