首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 表結構與數據差異對比:MINUS 集合運算一條 SQL 搞定

     編輯:Oracle 教學

Oracle 兩表結構與數據差異快速對比:MINUS + UNION 實戰技巧

需求:對比兩張表結構是否一致、數據是否相同。手工對比字段多、數據量大時不可行。利用 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');

二、表結構差異對比 SQL

(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'。

三、表數據差異對比 SQL

(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

五、反思與擴展

  • 數學集合論思維是 SQL 進階關鍵,平時多練習 MINUS/INTERSECT 場景;
  • 大表對比時 MINUS 可能產生大量排序,建議先抽樣或對比關鍵業務鍵;
  • 生產環境可封裝為存儲過程,定時對比關鍵表並告警差異。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved