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效率更好
引用学习链接:
https://m.php.cn/article/485143.html