如圖,現在有兩個數據集,左邊表示#tempTable1,右邊表示#tempTable2。現在有以下問題:
1.求兩個集的交集?
2.求tempTable1中不屬於集#tempTable2的集?
先創建兩張臨時表:
create table #tempTable1 ( argument1 nvarchar(50), argument2 varchar(20), argument3 datetime, argument4 int ); insert into #tempTable1(argument1,argument2,argument3,argument4) values('preacher001','13023218757',GETDATE()-1,1); insert into #tempTable1(argument1,argument2,argument3,argument4) values('preacher002','23218757',GETDATE()-2,2); insert into #tempTable1(argument1,argument2,argument3,argument4) values('preacher003','13018757',GETDATE()-3,3); insert into #tempTable1(argument1,argument2,argument3,argument4) values('preacher004','13023257',GETDATE()-4,4); insert into #tempTable1(argument1,argument2,argument3,argument4) values('preacher005','13023218',GETDATE()-5,5); insert into #tempTable1(argument1,argument2,argument3,argument4) values('preacher006','13023218',GETDATE()-6,6); insert into #tempTable1(argument1,argument2,argument3,argument4) values('preacher007','13023218',GETDATE()-7,7); insert into #tempTable1(argument1,argument2,argument3,argument4) values('preacher008','13023218',GETDATE()-8,8); create table #tempTable2 ( argument1 nvarchar(50), argument2 varchar(20), argument3 datetime, argument4 int ); insert into #tempTable2(argument1,argument2,argument3,argument4) values('preacher001','13023218757',GETDATE()-1,1); insert into #tempTable2(argument1,argument2,argument3,argument4) values('preacher0010','23218757',GETDATE()-10,10); insert into #tempTable2(argument1,argument2,argument3,argument4) values('preacher003','13018757',GETDATE()-3,3); insert into #tempTable2(argument1,argument2,argument3,argument4) values('preacher004','13023257',GETDATE()-4,4); insert into #tempTable2(argument1,argument2,argument3,argument4) values('preacher009','13023218',GETDATE()-9,9);
比如,我現在以#tempTable1和#tempTable2的argument1作為參照
1.求兩集的交集:
1)in 方式
select * from #tempTable2 where argument1 in (select argument1 from #tempTable1)
2)exists 方式
select * from #tempTable2 t2 where exists (select * from #tempTable1 t1 where t1.argument1=t2.argument1)
2.求tempTable1中不屬於集#tempTable2的集
1)in 方式
select * from #tempTable1 where argument1 not in (select argument1 from #tempTable2)
2)exists 方式
select * from #tempTable1 t1 where not exists (select * from #tempTable2 t2 where t1.argument1=t2.argument1)
3)exists對應數據的行索引
例如現在有兩張表tbl_customer,tbl_phone,其中一個客戶對應一個或多個電話信息,在維護電話號碼時,往往會顯示例如客戶姓名、客戶性別、修改人、修改時間等等點,查看選中的客戶電話詳細記錄時可以查看該客戶名義下的所有電話號碼信息;因為是維護的客戶電話號碼,所以這里的修改人和修改時間應該針對的是當前客戶對應的所有電話號碼的最新修改時間,那么在提取這些數據時,可以使用 max() 和 exists獲取這一個特別數據。
create
table tbl_phone
(
id number( 12) not null,
customer_id number( 12),
phonenumber varchar( 20),
isdeleted char( 1),
syscreatedatetime date,
syscreater number( 12),
syslastmodifytime date,
syslastmodifier number( 12)
(
id number( 12) not null,
customer_id number( 12),
phonenumber varchar( 20),
isdeleted char( 1),
syscreatedatetime date,
syscreater number( 12),
syslastmodifytime date,
syslastmodifier number( 12)
)
create
table tbl_customer
(
id number( 12) not null,
name varchar( 50),
gender char( 1),
isdeleted char( 1),
syscreatedatetime date,
syscreater number( 12),
syslastmodifytime date,
syslastmodifier number( 12)
(
id number( 12) not null,
name varchar( 50),
gender char( 1),
isdeleted char( 1),
syscreatedatetime date,
syscreater number( 12),
syslastmodifytime date,
syslastmodifier number( 12)
)
查詢語句這樣寫:
select distinct c.name,
code(c.gender,
'
1
',
'
男
',
'
0
',
'
女
',
null)
as gender,
( select syslastmodifytime
from tbl_phone
where exists ( select max(t.syslastmodifytime)
from tbl_vip_phone t
where t.customer_id = a.id)
and rownum = 1) as syslastmodifytime,
( select syslastmodifier
from tbl_phone
where exists ( select max(t.syslastmodifytime)
from tbl_vip_phone t
where t.customer_id = a.id)
and rownum = 1) as syslastmodifier
from tbl_customer c
join tbl_phone p
on c.isdeleted = 0
and p.isdeleted = 0
and c.id = p.customer_id
( select syslastmodifytime
from tbl_phone
where exists ( select max(t.syslastmodifytime)
from tbl_vip_phone t
where t.customer_id = a.id)
and rownum = 1) as syslastmodifytime,
( select syslastmodifier
from tbl_phone
where exists ( select max(t.syslastmodifytime)
from tbl_vip_phone t
where t.customer_id = a.id)
and rownum = 1) as syslastmodifier
from tbl_customer c
join tbl_phone p
on c.isdeleted = 0
and p.isdeleted = 0
and c.id = p.customer_id