读书人

求一SQL语句。该如何解决

发布时间: 2013-10-21 17:02:52 作者: rapoo

求一SQL语句。
我有一代码如下,小数点代表级别,想排除最下级的代码,只取出没下级代码的行。这表没记录是否最明细级,也没记录上级代码。

KD01
KD01.0024
KD01.0024.0022
KD01.0024.0024
KD01.0011
KD01.0011.0009
KD01.0011.0010
KD01.0011.0010.0001
KD01.0011.0011
KD01.0011.0012
KD01.0011.0005
KD01.0011.0005.0003


[解决办法]

;with cte(col) as
(
select 'KD01'
union all select 'KD01.0024'
union all select 'KD01.0024.0022'
union all select 'KD01.0024.0024'
union all select 'KD01.0011'
union all select 'KD01.0011.0009'
union all select 'KD01.0011.0010'
union all select 'KD01.0011.0010.0001'
union all select 'KD01.0011.0011'
union all select 'KD01.0011.0012'
union all select 'KD01.0011.0005'
union all select 'KD01.0011.0005.0003'
)
select *
from cte a
where exists(select 1 from cte b where len(a.col)>LEN(b.col) and CHARINDEX(b.col,a.col)=0)

/*
col
KD01.0024.0022
KD01.0024.0024
KD01.0011.0009
KD01.0011.0010
KD01.0011.0010.0001
KD01.0011.0011
KD01.0011.0012
KD01.0011.0005
KD01.0011.0005.0003
*/
--没有下级的行。这是你想要的结果吗?

[解决办法]

只取出没下级代码的行
with cte(col) as
(
select 'KD01'
union all select 'KD01.0024'
union all select 'KD01.0024.0022'
union all select 'KD01.0024.0024'
union all select 'KD01.0011'
union all select 'KD01.0011.0009'
union all select 'KD01.0011.0010'
union all select 'KD01.0011.0010.0001'
union all select 'KD01.0011.0011'
union all select 'KD01.0011.0012'
union all select 'KD01.0011.0005'
union all select 'KD01.0011.0005.0003'
)
select *
from cte a
WHERE EXISTS(SELECT 1 FROM cte WHERE LEN(col)>LEN(a.col) AND col LIKE a.col+'%')

[解决办法]
兄弟们 嗷嗷啊 有那么复杂吗



如果你是要取出来
KD01.0024.0022
KD01.0024.0024
KD01.0011.0009
KD01.0011.0010.0001
KD01.0011.0011
KD01.0011.0012
KD01.0011.0005.0003

select dm from tabdm where len(dm)>4 and left(dm,len(dm)-4) not in (select tabdmbb).dm from tabdm tabdmbb)

就是取出来 所有的 上级代码不在当当前字段的所有行
[解决办法]
重新发一下


如果你是要取出来
KD01.0024.0022
KD01.0024.0024
KD01.0011.0009
KD01.0011.0010.0001
KD01.0011.0011
KD01.0011.0012
KD01.0011.0005.0003

假设 表名tabdm 字段名dm
select dm from tabdm where len(dm)>=5 and left(dm,len(dm)-5) not in (select tabdmbb.dm from tabdm tabdmbb)

意思是
left(dm,len(dm)-5) 是当前记录的上级代码
然后上级代码 不在当前列中

读书人网 >SQL Server

热点推荐