重复信息中case when exists 的应用...

本文介绍了一种使用casewhenexists函数优化SQL查询的方法,通过在复杂的内连接查询中应用这一函数,实现了对特定字段值的高效过滤与排序。文章详细解释了casewhenexists函数的用法及其在处理重复信息时的优势,并通过实例展示了如何在查询中灵活运用这一特性。此外,还介绍了casewhenexists函数在嵌套查询场景下的应用,以及如何通过条件判断来获取特定记录集的第一条或最后一条记录。

重复信息中case when exists 的应用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

create table #a(Fname varchar(30),fqun decimal(18,2),fclass int )
create table #b ( fclass int,name varchar(30))
insert into #a
select 'a',20,1
union all
select 'a',20,2
union all
select 'a',20,3
union all
select 'B',10,1
union all
select 'B',10,2

insert into #b
select 1,'A'
union
select 2,'B'
union
select 3,'C'

select a.*,b.name from #a a inner join #b b on a.fclass = b.fclass
要求输出格式为

Fname fqun fclass name
------------------------------ -------------------- ----------- ------------------------------
a 20.00 1 A
2 B
3 C
B 10.00 1 A
2 B

-解决-

create table #a(Fname varchar(30),fqun decimal(18,2),fclass int )

create table #b ( fclass int,name varchar(30))

insert into #a

select 'a',20,1

union all

select 'a',20,2

union all

select 'a',20,3

union all

select 'B',10,1

union all

select 'B',10,2

insert into #b

select 1,'A'

union

select 2,'B'

union

select 3,'C'

---select a.*,b.name from #a a inner join #b b on a.fclass = b.fclass

select Fnane=(case when exists (select 1 from #a where a.fname = fname and fclass<a.fclass) then '' else a.fname end)

,fqun=(case when exists (select 1 from #a where a.fqun = fqun and fclass<a.fclass) then '' else ltrim(a.fqun) end)

,a.fclass

,b.name

from #a a

inner join #b b

on a.fclass =b.fclass

order by a.Fname,a.fclass

drop table #a,#b

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

a 20.00 1 A

2 B

3 C

B 10.00 1 A

2 B

这里需要注意的就是case when exists(select 1 from #a …..

这里的是一个嵌套查询,需要处理的字段里层与外层sql 相等,然后再加一条件,不处理的条件做大小比较。根据 大于 或 小于 可以控制为相同记录的第一条记录,或最后一条记录

如果外层 小于 里层,就是第一条,反之,就是最后一条

例子:

declare @t table(F1 varchar(8),F2 varchar(8))

insert into @t values('01','a ')

insert into @t values('01','aa ')

insert into @t values('02','b ')

insert into @t values('02','bb ')

insert into @t values('02','bbb')

--select * from @t

select F1=(Case when exists (select 1 from @t where F1=a.F1 and F2<a.F2) then '' else F1 end)

,a.F2

from @t a

order by a..F1,a.F2

--Result--

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

01 a

aa

02 b

bb

bbb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值