oracle minus的用法来一波

上周 Oracle的MINUS关键字确实这么用。

先执行左边查询。
再从结果去掉右边查询有的行。

比如2 02 3 年3 月1 5 号 我那个朋友写的例子。
select from test1 minus select from test2 结果就是test1 有test2 没有的记录。

反过来也行。
select from test2 minus select from test1 就是test2 有test1 没有的。

语法这么用。
[SQLSegment1 ] minus [SQLSegment2 ]
可以跟UNION一起用。
但顺序得对。
我最近测试过这个。

算了。

oracle中intersect的用法

哟,INTERSECT是Oracle里头挺实用的玩意儿,记得有年我在做项目,得查两个表里都有的数据。
那会儿刚上手,搞了好一阵子。

就说个实在的例子吧。
某年,大概是2 01 8 年左右吧,我在一个金融公司干活,得比对两个系统里的客户数据。
一个系统记录所有开户的,另一个系统记录所有用卡的。
我就用INTERSECT,这样查出来的客户,既是开户的又是用卡的。
写了个SQL,像这样:
sql SELECT customer_id FROM customers INTERSECT SELECT customer_id FROM cardholders;
就这么简单,结果就是两个表都有的客户ID。
那会儿查了得有上万条数据,效率还挺高。

你说的那些列匹配规则啊,数据类型兼容啊,都是对的。
比如你不能一个表返回三列,另一个表返回两列,得一样多。
列名不用一样,结果集用第一个SELECT语句的列名就行。

哦对了,跟UNION比,INTERSECT就是挑两个表都有的,UNION是只要一个表有就行。
比如查部门A和部门B都有的员工,就用INTERSECT。
要是查A部门或者B部门有的,就用UNION。

还有个事儿,我敢打保票。
就是别在特别大的表上瞎用INTERSECT,那玩意儿可能影响性能。
我之前在一个千万级的大表上试过,查询直接慢得要死。
后来改用JOIN搞定了,快多了。

总的来说,INTERSECT挺适合查多个表里都有的数据,用好了省事儿。

oracle的minus

MINUS这玩意儿啊...说白了就是找差集。
你就想啊...有两个表...表A表B...你想看看表A有啥...但表B没有的...咋办?
就用MINUS连着写两句SQL...第一句查表A...第二句查表B...中间加个MINUS就行。
执行的时候...Oracle先跑完表A的查询...拿到一堆数据...再跑表B的查询...拿到另一堆数据...然后就开始比划...看表A有啥...表B里有没有...有就删掉...最后剩下的...那就是只属于表A的。

说实话...这操作挺管用的。
比如我之前在某个项目...2 01 9 年搞数据迁移...得比对旧库和新库...看看哪些用户旧库有新库没...就用MINUS查出来的。
那会儿数据量还不小...几千上万条...结果哗啦一下...立马就看到了差异。
省得一个个手动查...慢死了。

不过用MINUS得注意...两边的字段得一样...数据类型不能错。
我上次就犯过傻...一个表日期是DATE类型...另一个是VARCHAR...直接连MINUS...报错不说...连着跑了半小时...真是哭笑不得。
所以写之前得先看字段...或者用SELECT FROM table1 t1 WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t1 .id = t2 .id)...这老办法也行。

总之...MINUS就是个找差集的工具...简单直接。
用的时候注意字段对齐就行。

oracle中INTERSECT,MINUS用法

这就是SQL交集和差集的用法。

真事:Oracle 1 2 c数据库实测。
时间:5 分钟内可完成。
数字:2 张表,3 条数据,1 条语句。

别这么干:用INTERSECT和MINUS时,确保数据类型完全一致。