oracle中的minus數據比對


1、要有唯一索引或者主鍵作為前提,減少數據沖突的數量,如示例標紅的地方:

 
2、當有in查詢的時候,盡量用exists,這樣能提高查詢效率:
create table TF_F_USER_DIFF1 tablespace BD_TBS_EXP_DATA parallel 20  as  select /*+ parallel(c,20) */ * from TF_F_USER_DIFF c where  not exists(select /*+ parallel(a,10) */ user_id from TF_F_USER_CRM a where a.user_id=c.user_id);
低效率查詢是這樣的
create table TF_F_USER_DIFF1 tablespace BD_TBS_EXP_DATA parallel 20  as  select /*+ parallel(c,20) */ * from TF_F_USER_DIFF c where  a.user_id not in(select /*+ parallel(a,10) */ user_id from TF_F_USER_CRM a);
 
3、ORACLE中的minus內部實現是有唯一索引機制或者主鍵機制,所以不需要像在其他表數據比對軟件中那樣要指定唯一索引或者主鍵那么麻煩,這個大贊。
 
4、如果兩張表的數據量差異太大的話,建議按每個列分別比對,而不是把所有的列放在一起直接minus,因為minus之后的結果需要關聯查詢,兩張大表關聯查詢效率不高。
  1)分別比對:select columnA,columnB from tableA minus select columnC,columnD from tableB,其中columnA,columnC分別是兩張表的主鍵,這樣就只比對columnB,columnD這兩列了。
  2)把所有的列放在一起比對:select columnA,columnB,columnE,columnF,columnG,coulumnH from tableA minus select columnC,columnD,columnL,columnM,columnN,coulumnI from tableB
 
5、找出既在A表中有數據,又在C表中有數據,其中VPN_ID、MEMBER_ROLE_ID、START_DATE是聯合主鍵:

create table Tf_f_User_Member_CRM tablespace BD_TBS_EXP_DATA parallel 20 as
SELECT /*+ parallel(c,20) */
*
FROM TF_F_USER_MEMBER_DIFF C
WHERE EXISTS (SELECT /*+ parallel(a,10) */
a.vpn_id,a.member_role_id,a.start_date
FROM ucr_group_online.TF_F_USER_MEMBER_DIFF A
WHERE A.VPN_ID = C.VPN_ID AND A.MEMBER_ROLE_ID = C.MEMBER_ROLE_ID AND A.START_DATE = C.START_DATE);

最好不要用下面的SQL語句,因為它是等值查詢,會發生笛卡爾積,導致數據成倍的增長,最終結果不准確:

create table Tf_f_User_Member_diff1 tablespace BD_TBS_EXP_DATA parallel 20 as
SELECT /*+ parallel(c,20) */ /*+ parallel(a,20) */
c.*
FROM TF_F_USER_MEMBER_DIFF C, UCR_GROUP_ONLINE.TF_F_USER_MEMBER_DIFF A
WHERE A.VPN_ID = C.VPN_ID AND A.MEMBER_ROLE_ID = C.MEMBER_ROLE_ID AND A.START_DATE = C.START_DATE;

 
6、找出只在C表中存在數據,A表中不存在相同的數據,其中VPN_ID、MEMBER_ROLE_ID、START_DATE是聯合主鍵:

create table Tf_f_User_Member_CRM tablespace BD_TBS_EXP_DATA parallel 20 as
SELECT /*+ parallel(c,20) */
*
FROM TF_F_USER_MEMBER_DIFF C
WHERE not EXISTS (SELECT /*+ parallel(a,10) */
a.vpn_id,a.member_role_id,a.start_date
FROM ucr_group_online.TF_F_USER_MEMBER_DIFF A
WHERE A.VPN_ID = C.VPN_ID AND A.MEMBER_ROLE_ID = C.MEMBER_ROLE_ID AND A.START_DATE = C.START_DATE);

 
7、oracle中的minus有排重作用:比如A={1,2,3,4},B={5,6,7,7},雖然兩邊的數據量是一樣的,數據是完全不同的,理應B minus A的數據量是4,但是B minus A={5,6,7},只有三條數據,就是因為minus排重了。A minus B={1,2,3,4},數據量是4,說明A表中沒有重復數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM