Oracale 和 SQLSERVER 中皆有差集函數去比較兩個數據集合中的差異的數據 => EXCEPT
使用如下:
SELECT FASSETID,FALTERID,FCKFUNDPROVIDED FROM KDY_T_FA_FUNDBALANCE WHERE FYEAR = 2022 AND FPERIOD = 10
EXCEPT
SELECT FASSETID,FALTERID,FCKFUNDPROVIDED FROM KDY_T_FA_FUNDBALANCE WHERE FYEAR = 2022 AND FPERIOD = 11
查詢結果如下:
mysql 中無EXCEPT函數,故有兩種方法去求得差集:
1.not exists
上面SQL語句可以替換如下語句:
SELECT FASSETID,FALTERID,FCKFUNDPROVIDED FROM KDY_T_FA_FUNDBALANCE A WHERE FYEAR = 2022 AND FPERIOD = 10 AND NOT EXISTS(
SELECT 1 FROM KDY_T_FA_FUNDBALANCE B WHERE FYEAR = 2022 AND FPERIOD = 11 AND B.FASSETID = A.FASSETID AND B.FALTERID = A.FALTERID AND B.FCKFUNDPROVIDED = A.FCKFUNDPROVIDED
)
2.left join
用左(右)連接來求差集,由於需要實施兩表連接會導致笛卡爾效應其輸出集的記錄行可能會增多,
若果不是一對一或一對多,我們應該將多對多的情況處理成多對一後才進行連接,否則輸出的記錄集可能不正確。
總結:求差集的兩種方法,有索引可利用時,not exists的效率要高於left join,反之left join效率更好