如何在具有相同列的两个表中查找不同的行?

时间:2018-09-03 16:15:53

标签: sql

我有两个表具有完全相同的列集。我想选择所有不完全匹配的行。有没有一种方法,而不必按每一列联接或以任何其他方式键入每一列的名称(我有很多方法)?

3 个答案:

答案 0 :(得分:1)

如果列的数量,类型和顺序完全相同,则可以使用EXCEPT(或在某些DBMS MINUS中)运算符从第一个表中删除所有与从第二个表开始的行(按每一列)。

SELECT *
       FROM table1
EXCEPT
SELECT *
       FROM table2;

(如果不需要或不需要重复消除,请使用EXCEPT ALL。如果还希望在交换操作数时得到结果,则可以使用UNION(或UNION ALL合并第二个EXCEPT操作的结果。如有疑问,请使用括号对操作进行优先级排序。)

答案 1 :(得分:1)

使用minus

select * from tableA
   minus
   select * from tableB

如果查询不返回任何行,则数据完全相同。

答案 2 :(得分:0)

您可以使用PK的SELECT * FROM src s FULL OUTER JOIN trg t ON s.id = t.id WHERE NOT EXISTS (SELECT s.col1, s.col2, s.col3, s.col4 INTERSECT SELECT t.col1, t.col2, t.col3, t.col4); 并使用以下方法比较所有其他列:

SELECT *
FROM src s
FULL OUTER JOIN trg t
  ON s.id = t.id
WHERE NOT EXISTS (SELECT s.* EXCEPT s.id
                  INTERSECT
                  SELECT t.* EXCEPT t.id);

请注意,这种方法可以并行比较数据。

DBFiddle Demo


编辑:

  

那还是需要明确提及每一列?我宁愿不要。

是的,但是您可以使用对象浏览器(SSMS / TOAD / Oracle Developer)中的拖放操作,避免手动键入它们。

SELECT * EXCEPT(仅Google Big Query):

^((?!somerealdomain\.com).)*$