oracle中的交集、并集、差集

[sql]

create
table test1 


 name
varchar(10), 

 NN
varchar(10) 

); 

insert
into test1 values(‘test‘,‘A‘); 

insert
into test1 values(‘test1‘,‘B‘); 

insert
into test1 values(‘test1‘,‘C‘); 

insert
into test1 values(‘test1‘,‘D‘); 

insert
into test1 values(‘test1‘,‘E‘); 

create
table test2 


 name
varchar(10), 

 NN
varchar(10) 

); 

insert
into test2 values(‘test‘,‘A‘); 

insert
into test2 values(‘test2‘,‘B‘); 

insert
into test2 values(‘test2‘,‘C‘); 

insert
into test2 values(‘test2‘,‘D‘); 

insert
into test2 values(‘test2‘,‘E‘); 

1、交集:intersect

[sql]

SQL>
select * from
test1 intersect
select
* from
test2; 

  

NAME      
NN 

---------- ---------- 

test       A 

2、并集:unionunion
all (注意两者的区别)

[sql]

SQL>
select * from
test1 union
select
* from
test2; 

  

NAME      
NN 

---------- ---------- 

test       A 

test1      B 

test1      C 

test1      D 

test1      E 

test2      B 

test2      C 

test2      D 

test2      E 

  

9
rows selected. 

[sql]

SQL>
select * from
test1 union
all
select *
from test2; 

  

NAME      
NN 

---------- ---------- 

test       A 

test1      B 

test1      C 

test1      D 

test1      E 

test       A 

test2      B 

test2      C 

test2      D 

test2      E 

  

10
rows selected. 

3、差集:minus

[sql]

SQL>
select * from
test1 minus select
* from
test2; 

  

NAME      
NN 

---------- ---------- 

test1      B 

test1      C 

test1      D 

test1      E 

  

SQL>
select * from
test2 minus select
* from
test1; 

  

NAME      
NN 

---------- ---------- 

test2      B 

test2      C 

test2      D 

test2      E 

最后对于求交集用intersect效率高呢还是hash
join效率高呢?

[sql]

SQL>
select * from
test1 intersect
select
* from
test2; 

  

  

Execution Plan 

---------------------------------------------------------- 

Plan hash value: 4290880088 

  

----------------------------------------------------------------------------- 

| Id  | Operation           |
Name  | Rows 
| Bytes | Cost (%CPU)| Time    

----------------------------------------------------------------------------- 

|   0 |
SELECT STATEMENT    |       |     5 |   140 |     8  (63)| 00:00:01 | 

|   1 |  INTERSECTION       |       |       |       |            |          | 

|   2 |   SORT
UNIQUE       |       |     5 |    70 |     4  (25)| 00:00:01 | 

|   3 |   
TABLE ACCESS
FULL| TEST1 |     5 |    70 |     3   (0)| 00:00:01 | 

|   4 |   SORT
UNIQUE       |       |     5 |    70 |     4  (25)| 00:00:01 | 

|   5 |   
TABLE ACCESS
FULL| TEST2 |     5 |    70 |     3   (0)| 00:00:01 | 

----------------------------------------------------------------------------- 

  

Note 

----- 

   -
dynamic sampling used
for this statement (level=2) 

  

  

Statistics

---------------------------------------------------------- 

          0  recursive calls 

          0  db block gets 

         14  consistent gets 

          0  physical reads 

          0  redo
size

        590  bytes sent via SQL*Net
to client 

        523  bytes received via SQL*Net
from client 

          2  SQL*Net roundtrips
to/from
client 

          2  sorts (memory) 

          0  sorts (disk) 

          
rows processed 

  

  

SQL>
select a.*
from test1 a,test2 b
where a.name=b.name
and a.nn=b.nn; 

  

  

Execution Plan 

---------------------------------------------------------- 

Plan hash value: 497311279 

  

---------------------------------------------------------------------------- 

| Id  | Operation          |
Name  | Rows 
| Bytes | Cost (%CPU)| Time    

---------------------------------------------------------------------------- 

|   0 |
SELECT STATEMENT   |       |     5 |   140 |     7  (15)| 00:00:01 | 

|*  1 |  HASH
JOIN         |       |     5 |   140 |     7  (15)| 00:00:01 | 

|   2 |  
TABLE ACCESS
FULL| TEST1 |     5 |    70 |     3   (0)| 00:00:01 | 

|   3 |  
TABLE ACCESS
FULL| TEST2 |     5 |    70 |     3   (0)| 00:00:01 | 

---------------------------------------------------------------------------- 

  

Predicate Information (identified
by operation id): 

--------------------------------------------------- 

  

   1 - access("A"."NAME"="B"."NAME"
AND "A"."NN"="B"."NN"

  

Note 

----- 

   -
dynamic sampling used
for this statement (level=2) 

  

  

Statistics

---------------------------------------------------------- 

          0  recursive calls 

          0  db block gets 

         15  consistent gets 

          0  physical reads 

          0  redo
size

        590  bytes sent via SQL*Net
to client 

        523  bytes received via SQL*Net
from client 

          2  SQL*Net roundtrips
to/from
client 

          0  sorts (memory) 

          0  sorts (disk) 

          
rows processed

时间: 2024-10-29 04:35:40

oracle中的交集、并集、差集的相关文章

oracle中取交集、差集和并集的语法

这里简单总结下在Oracle中取交集.差集和并集的语法. 交集:INTERSECT(适用于两个结果集) SELECT ID, NAME FROM YANGGB1 INTERSECT SELECT ID, NAME FROM YANGGB2 差集:MINUS(适用于两个结果集) SELECT ID, NAME FROM YANGGB1 MINUS SELECT ID, NAME FROM YANGGB2 并集:UNION或UNION ALL(适用于两个结果集) -- 不包括重复行,进行默认排序 S

sql server中取交集、差集和并集的语法

这里简单总结下在SQL Server中取交集.差集和并集的语法. 交集:INTERSECT(适用于两个结果集) SELECT ID, NAME FROM YANGGB1 INTERSECT SELECT ID, NAME FROM YANGGB2 差集:EXCEPT(适用于两个结果集) SELECT ID, NAME FROM YANGGB1 EXCEPT SELECT ID, NAME FROM YANGGB2 并集:UNION或UNION ALL(适用于两个结果集) -- 不包括重复行,进行

Python 求两个文本文件以行为单位的交集 并集 差集

Python 求两个文本文件以行为单位的交集 并集 差集,来代码: s1 = set(open('a.txt','r').readlines()) s2 = set(open('b.txt','r').readlines()) print 'ins: %s'%(s1.intersection(s2)) print 'uni: %s'%(s1.union(s2)) print 'dif: %s'%(s1.difference(s2).union(s2.difference(s1))) 原文地址:h

十二道MR习题 - 3 - 交集并集差集

题目 有两个文件A和B,两个文件中都有几百万行数字,现在需要找出A文件和B文件中数字集合的交集.并集.以及A对B的差集. 简单说一下思路: 这个问题关键在于key和value的设计.这里我将文件中的数字设置为key,将文件名称设置为value.这样在reduce阶段很容易就能找出A.B两个文件中数字的交并差集了. 并集就是reduce阶段能输出的全部记录:交集则需要做下过滤,即一个记录中的value需要同时有A.B两个文件的名称:差集则是文件名称集合中只包含A或B的记录. 看下用MapReduc

(一)Python入门-3序列:19集合-特点-创建和删除-交集并集差集运算

集合: 集合是无序可变,元素不能重复.实际上,集合底层是字典实现,集合的所有元素都是字典 中的“键对象”,因此是不能重复的且唯一的. 一:集合的创建和删除 1. 使用{}创建集合对象,并使用 add()方法添加元素 1 >>> a = {1,3,5} 2 >>> a 3 {1, 3, 5} 4 >>> a.add(7) 5 >>> a 6 {1, 3, 5, 7} 7 >>> a.add(5) 8 >>&

Java求字符串数组交集 并集 差集 去重复并集

//系统方法 package com; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { List list1 =new ArrayList(); list1.add("1111"); list1.add("2222"); list1.add

C# 取两个集合的交集\并集\差集

交集:Intersect 并集:Union 差集:Except var A= new List() { 1, 2, 3, 4, 5, 6 }; var B= new List() { 3, 4, 5, 6,7,8,9 }; var C= A.Intersect(B); //交集 { 3, 4, 5, 6 } var D= A.Union(B); //并集 { 1, 2, 3, 4, 5, 6,7,8,9 } var E= A.Except(B); //差集 { 1, 2 } var F= B.E

java list 交集 并集 差集 去重复并集

package com; import java.util.ArrayList;import java.util.Iterator;import java.util.List; public class Test { public static void main(String[] args) {  List list1 =new ArrayList();  list1.add("1111");  list1.add("2222");  list1.add(&quo

js Array 交集 并集 差集 去重

最劲项目需要用到js数组去重和交集的一些运算,我的数组元素个数可能到达1000以上,网上的实现方式都是2次循环,性能不适合我的需求,1000*1000那循环次数太多了,所以我这里采用对象object来做处理,用空间换时间,code 如下: ///集合取交集 Array.intersect = function () { var result = new Array(); var arrCount = arguments.length;/*数组个数,默认2个数组取交集*/ if (arrCount