有一张科目表有如下,但是没有明显的字段标明那一个是末级科目,请问如何查找出末级科目
有一张科目表有如下,但是没有明显的字段标明那一个是末级科目,请问如何查找出末级科目
代码 项目名称
20310项目1
2031001项目1.1
2031002项目1.2
203100201项目1.2.1
203100202项目1.2.2
2031003项目1.3
2031004项目1.4
找出来应该是这样
代码 项目名称 是否末级
20310项目1 否
2031001项目1.1 是
2031002项目1.2 否
203100201项目1.2.1 是
203100202项目1.2.2 是
2031003项目1.3 是
2031004项目1.4 是
[解决办法]
--try:
select 代码,项目名称,
是否末级=case when (select count(*) from 科目表 where 代码 like rtrim(A.代码)+ '% ')> 1
then '否 '
else '是 '
end
from 科目表 A
[解决办法]
有點問題,修改下
Select Distinct A.*, (Case When B.代码 Is Null Then '是 ' Else '否 ' End) As 是否末级
From 科目表 A
Left Join 科目表 B
On B.代码 Like A.代码 + '% ' And A.代码 != B.代码
[解决办法]
--建立测试环境
create table #tb(代码 varchar(10),项目名称 varchar(10))
insert #tb(代码,项目名称)
select '20310 ', '项目1 ' union all
select '2031001 ', '项目1.1 ' union all
select '2031002 ', '项目1.2 ' union all
select '203100201 ', '项目1.2.1 ' union all
select '203100202 ', '项目1.2.2 ' union all
select '2031003 ', '项目1.3 ' union all
select '2031004 ', '项目1.4 '
go
--执行测试语句
select t.代码,t.项目名称,isnull(max(case when t2.代码 is null then '是 ' end), '否 ')
from #tb t
left join #tb t2 on charindex(t.代码,t2.代码) > 0 and t.代码 <> t2.代码
group by t.代码,t.项目名称
go
--删除测试环境
drop table #tb
go
/*--测试结果
代码 项目名称
---------- ---------- ----
20310 项目1 否
2031001 项目1.1 是
2031002 项目1.2 否
203100201 项目1.2.1 是
203100202 项目1.2.2 是
2031003 项目1.3 是
2031004 项目1.4 是
(7 row(s) affected)
*/
[解决办法]
--創建測試環境
Create Table 科目表
(代码 Varchar(50),
项目名称 Nvarchar(50))
Insert 科目表 Select '20310 ',N '项目1 '
Union All Select '2031001 ',N '项目1.1 '
Union All Select '2031002 ',N '项目1.2 '
Union All Select '203100201 ',N '项目1.2.1 '
Union All Select '203100202 ',N '项目1.2.2 '
Union All Select '2031003 ',N '项目1.3 '
Union All Select '2031004 ',N '项目1.4 '
GO
--測試
Select Distinct A.*, (Case When B.代码 Is Null Then '是 ' Else '否 ' End) As 是否末级
From 科目表 A
Left Join 科目表 B
On B.代码 Like A.代码 + '% ' And A.代码 != B.代码
GO
--刪除測試環境
Drop Table 科目表
--結果
/*
代码项目名称是否末级
20310项目1否
2031001项目1.1是
2031002项目1.2否
203100201项目1.2.1是
203100202项目1.2.2是
2031003项目1.3是
2031004项目1.4是
*/
[解决办法]
用charindex可能不准确,改为like
--建立测试环境
create table #tb(代码 varchar(10),项目名称 varchar(10))
insert #tb(代码,项目名称)
select '20310 ', '项目1 ' union all
select '2031001 ', '项目1.1 ' union all
select '2031002 ', '项目1.2 ' union all
select '203100201 ', '项目1.2.1 ' union all
select '203100202 ', '项目1.2.2 ' union all
select '2031003 ', '项目1.3 ' union all
select '2031004 ', '项目1.4 '
go
--执行测试语句
select t.代码,t.项目名称,isnull(max(case when t2.代码 is null then '是 ' end), '否 ')
from #tb t
left join #tb t2 on t2.代码 like t.代码 + '% ' and t.代码 <> t2.代码
group by t.代码,t.项目名称
go
--删除测试环境
drop table #tb
go
/*--测试结果
代码 项目名称
---------- ---------- ----
20310 项目1 否
2031001 项目1.1 是
2031002 项目1.2 否
203100201 项目1.2.1 是
203100202 项目1.2.2 是
2031003 项目1.3 是
2031004 项目1.4 是
(7 row(s) affected)
*/
[解决办法]
为什么最慢的老是我
[解决办法]
> 0 改成 =1 也可以
[解决办法]
鱼,你的测试数据是自己写的还是自动生成的,这么快?
[解决办法]
當然是自己寫的
[解决办法]
哎,我的是用存储过程自动生成的,还没你快.