Sqlserver 中exists 和 in


如圖,現在有兩個數據集,左邊表示#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( 12not  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( 12not  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 '' 'nullas 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  =  1as 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  =  1as syslastmodifier

   from tbl_customer c
   join tbl_phone p
     on c.isdeleted  =  0
    and p.isdeleted  =  0
    and c.id  = p.customer_id

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM