不使用EXCEPT函数下求差集

OracaleSQLSERVER 中皆有差集函数去比较两个数据集合中的差异的数据 => 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

posted @   CH|heyi  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2019-12-07 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10()随机1~10
2018-12-07 解决 Visual Studio 2017 打开项目提示项目不兼容
点击右上角即可分享
微信分享提示