需求:對比兩張表結構是否一致、數據是否相同。手工對比字段多、數據量大時不可行。利用 Oracle 集合運算 MINUS (差集) 配合 UNION,單條 SQL 即可雙向找出所有差異。
CREATE TABLE t_A (id VARCHAR2(36) NOT NULL, name VARCHAR2(100), age NUMBER, sex VARCHAR2(2));
INSERT INTO t_A VALUES ('1','1',1,'1');
INSERT INTO t_A VALUES ('2','2',2,'2');
CREATE TABLE t_B (id VARCHAR2(36) NOT NULL, name VARCHAR2(100), age NUMBER, clazz VARCHAR2(36));
INSERT INTO t_B VALUES ('1','1',1,'1');
INSERT INTO t_B VALUES ('2','2',1,'3');
INSERT INTO t_B VALUES ('3','3',3,'3');
(SELECT column_name FROM user_tab_columns WHERE table_name = 'T_A' MINUS SELECT column_name FROM user_tab_columns WHERE table_name = 'T_B') UNION (SELECT column_name FROM user_tab_columns WHERE table_name = 'T_B' MINUS SELECT column_name FROM user_tab_columns WHERE table_name = 'T_A');
結果:SEX (僅 T_A 有)、CLAZZ (僅 T_B 有)。
注意:user_tab_columns 存儲大寫表名,查詢條件需用 'T_A'。
(SELECT * FROM t_A MINUS SELECT * FROM t_B) UNION (SELECT * FROM t_B MINUS SELECT * FROM t_A);
結果:雙向差異行全顯示,包含 T_A 有而 T_B 無、T_B 有而 T_A 無的所有行。
前提:兩表列數、列順序、數據類型完全一致;否則需顯式列出公共列。
| 運算符 | 含義 | 口訣 |
|---|---|---|
| UNION | 並集 (去重) | A ∪ B |
| UNION ALL | 並集 (含重複) | A + B |
| INTERSECT | 交集 | A ∩ B |
| MINUS | 差集 (A 有 B 無) | A - B |
MINUS/INTERSECT 場景;MINUS 可能產生大量排序,建議先抽樣或對比關鍵業務鍵;