oracle中INTERSECT,MINUS用法

oracle中INTERSECT,MINUS用法,第1张

intersect 就是交集,minus 就是差集。

步骤举例如下:

1、分别创建两张表,TEST_A及TEST_B;

2、插入样例数据

insert into test_a values(1);

insert into test_a values(2);

insert into test_a values(3);

insert into test_b values(1);

insert into test_b values(2);

commit;

3、编写INTERSECT语句,select from TEST_A t INTERSECT select from TEST_B t;可以发现只有交集结果1、2;

4、编写MINUS语句,select from TEST_A t MINUS select from TEST_B t;可以发现只有差集结果3;

扩展资料

1、交集就是两个结果集中都有的元素。假设有两个数集A和B,A包含1、2、3,B包含1、2,这两个数集都有1、2,那么A和B交在一起的部分1、2,就是A和B的交集。

2、差集就是A中存在,但是B中不存在的数据集。假设有两个数集A和B,A包含1、2、3,B包含1、2,这两个数集差集就是1。

1MERGE 判断table1和table2是否满足ON中条件,如果满足则用table2表去更新table1表,如果不满足,则将table2表数据插入table1表但是有很多可选项,表关联更新

MERGE  INTO table1 a

    USING(

                 select bid bid,bname bname from table2 b left join table1 c on cid = bid

)bb on(aid = bbbid)

WHEN MATCHED THEN

UPDATE SET

        aname = bbbname

WHEN NOT MATCHED THEN

INSERT(

aid,aname

)VALUES(

bbbid,bbbname

);

2START WITH CONNECT BY PRIOR的作用,简单来说,就是将一个树状结构存储在一张表里,比如菜单表

select from table_menu start with menu_id='210' connect by prior menu_id=menu_parent_id;

查询菜单id为210下所有子菜单包括id为210的菜单。

3OVER(PARTITION BY)根据表中字段分割后在排序取第一条

select from (select r, row_number() over(PARTITION BY 字段1,字段2 order by 字段3 desc) rn

from table1 r

) where rn = 1;

4MINUS 表之间比较

select  id,name from table1

minus

select id,name from table2;

table1中有table2中无或者table1中id,name与table2中不同

EXCEPT和MINUS *** 作符

数据库程序设计的目标就是最大限度地减少需要通过网络传送的数据量 并消除客户端不必要的处理过程 也就是说 只向RDBMS请求需要的数据 不触动其余任何之物 INTERSECT *** 作符可以求取两个查询结果的交集 而EXCEPT *** 作符则用于求取两个查询结果的差集

INTERSECT *** 作符和EXCEPT *** 作符是一种便利的表示方式 可以使用INNER JOIN和OUTER JOIN来分别替代它们(加上某些调整 消除重复的记录)

在上面的例子中 如果使用EXCEPT *** 作符代替INTERSECT *** 作符 查询结果将显示在书柜上还没有分配到位置的所有图书(即在LOCATION表中没有相应的记录)

SELECT bk_id FROM books

EXCEPT

SELECT fk_bk_loc FROM location;

bk_id

( row(s) affected)

该查询仅返回在BOOKS表中存在的同时在LOCATION表中不存在相应记录的记录 在本章结尾的练习中将尝试使用INTERSECT *** 作符和EXCEPT *** 作符

可以使用NOT EXISTS *** 作符和相关子查询来代替EXCEPT(或MINUS)关键字 虽然没有获得SQL标准委员会的官方支持 但所有RDBMS都支持这种语法(除了在OpenOffice中作为嵌入式RDBMS的HSQLDB例外)

DB Microsoft SQL Server和PostgreSQL都实现了EXCEPT关键字 Oracle则使用MINUS关键字 MySQL和HSQLDB既支持EXCEPT *** 作符 又支持MINUS关键字 Microsoft Access对两者都不支持

试一试求取数据集的差集

为了进一步观察数据集 *** 作符(例如INTERSECT *** 作符和EXCEPT *** 作符)的使用 下面将在已经完美匹配的数据中添加一些新数据 在本章之前讨论LEFT OUTER JOIN时已经执行过类似的 *** 作 在下面的练习中可以再次使用相同的记录

接下来将在BOOKS表中添加一条不匹配的记录 用于演示INTERSECT *** 作符和EXCEPT *** 作符的应用

( ) 打开Microsoft SQL Server Management Studio 使用Windows身份验证连接到数据库

( ) 单击位于左上角的New Query按钮

( ) 在打开的查询窗口(中间的窗格)中输入下面的SQL查询

INSERT INTO books (bk_id bk_title)

VALUES ( UNMATCHED RECORD )

( ) 现在BOOKS表中已经具有一条新记录 该记录在LOCATION表中没有对应的位置 此时使用INTERSECT *** 作符和EXCEPT *** 作符将查询到什么结果呢?首先 执行一个使用INTERSECT *** 作符的查询

SELECT bk_id FROM books

INTERSECT

SELECT fk_bk_loc FROM location;

( ) 可以预见 该查询只会返回 条记录 BOOKS表与LOCATION表中都匹配的记录

( ) 运行使用EXCEPT *** 作符的查询将产生一个不同的结果

SELECT bk_id FROM books

EXCEPT

SELECT fk_bk_loc FROM location;

bk_id

( row(s) affected)

示例说明

在将一条新记录插入到BOOKS表之后 BOOKS表中包含了 条记录 但只有 条记录在LOCATION表中具有相匹配的记录 这模拟了买到一本新书但还没有在书柜中分配图书摆放位置的情形 INTERSECT *** 作符仅返回那些在两个表中都匹配的记录 因此 BK_ID = 的记录将被排除在外

当运行EXCEPT查询时 将分别从BOOKS表和LOCATION表中抽取匹配的记录 并将不匹配的记录返回 在本例中 不匹配的记录就是新插入的UNMATCHED RECORD这条记录

       返回目录 SQL实战新手入门

       编辑推荐

       Oracle索引技术

       高性能MySQL

lishixinzhi/Article/program/SQL/201311/16454

select from B

minus

select from A

用minus 这个函数,它的作用是 把B表查询出来的结果减去A表查询出来的结果,如果B表查询出来的结果不在A表中存在 就会查询出来结果,说明查询出来的内容和A表内容不一致。

如果没有结果说明 B表内容和A表一样。(前提A表和B表结构一直)

1、先确定表结构是否相同

这个查看通过数据字典就可以实现

oracle中表的数据字典是:all_tables

字段的数据字典是:all_tab_cols

select count() from

(select column_name,data_type,data_length

from all_tab_cols

where table_name = 'tab1'

minus

select column_name,data_type,data_length

from all_tab_cols

where table_name = 'tab2');

如果结果是0,则说明两个表结构相同

2、对比记录是否完全一致

select count() from

(select from tab1

minus

select from tab2);

如果结果是0,说明两个表大致相同。

这个例子只是对比了字段类型,长度,还有其他好多因素没对比(比如字段是否允许为空,是否有约束,表是否有触发器等等)。但我们通常意义上的相同比这两项就够了。其实两个表不可能完全相同,一个数据库中不可能出现完全相同的两个表

A 并 B 去掉重复记录----union

select empno, ename ,salary ,deptno from employee_ccy where deptno=10

union

select empno, ename ,salary ,deptno from employee_ccy where salary>100;

--union all 不排序,不去重复

select empno, ename ,salary ,deptno from employee_ccy where deptno=10 union all

select empno, ename ,salary ,deptno from employee_ccy where salary>100;

---交集-----intersect

select empno, ename ,salary ,deptno from employee_ccy where deptno=10

intersect

select empno, ename ,salary ,deptno from employee_ccy where salary>100;

--差集--------minus

select empno, ename ,salary ,deptno from employee_ccy where deptno=10

minus

select empno, ename ,salary ,deptno from employee_ccy where salary>100;

-------------用两个结果集的差集 ,获得

select deptno,dname ,location from department_ccy where deptno in(select deptno from department_ccy

minus

select distinct deptno from employee_ccy );

希望对你有帮助

select from B where 字段 in (select 字段 from A)

查询A中是否在B中存在

字段改成你要查的字段

提取的时候用 select distinct 字段 from A where 字段 not in (select 字段 from B) 插入时候用

以上就是关于oracle中INTERSECT,MINUS用法全部的内容,包括:oracle中INTERSECT,MINUS用法、Oracle数据库关键字用法,MERGE、START WITH 、OVER(PARTITION BY) 、MINUS、SQL实战新手入门:EXCEPT和MINUS *** 作符等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9301550.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存