我有两个表具有完全相同的列集。我想选择所有不完全匹配的行。有没有一种方法,而不必按每一列联接或以任何其他方式键入每一列的名称(我有很多方法)?
答案 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);
请注意,这种方法可以并行比较数据。
编辑:
那还是需要明确提及每一列?我宁愿不要。
是的,但是您可以使用对象浏览器(SSMS / TOAD / Oracle Developer)中的拖放操作,避免手动键入它们。
有SELECT * EXCEPT
(仅Google Big Query):
^((?!somerealdomain\.com).)*$