日期:2014-05-17  浏览次数:20545 次

SQLServer中如何根据一个城市码找出其下的所有城市?
层次结构如下:

浙江省-杭州市-西湖区

输入的参数可以是1100、1110、1111中的随便一个,返回值为改代码。

比如输入1100的话就返回1111、1112、1113

输入1110返回1111、1112

输入1111返回1111。

请该怎么样用sql语句实现?


城市 城市码 上一级代码 
浙江省 1100 -1 
杭州市 1110 1100 
西湖区 1111 1110 
上城区 1112 1110 
金华市 1120 1100 
下城区 1113 1120 

------解决方案--------------------
----------------------------
-- Author  :TravyLee(物是人非事事休,欲语泪先流!)
-- Date    :2012-11-28 09:36:30
-- Version:

--      Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86) 

-- Feb 10 2012 19:13:17 

-- Copyright (c) Microsoft Corporation

-- Enterprise Edition: Core-based Licensing on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)

--
----------------------------
--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
go 
create table [test]([城市] varchar(6),[城市码] int,[上一级代码] int)
insert [test]
select '浙江省',1100,-1 union all
select '杭州市',1110,1100 union all
select '西湖区',1111,1110 union all
select '上城区',1112,1110 union all
select '金华市',1120,1100 union all
select '下城区',1113,1120

select * from [test]
go

declare @上一级代码 int
set @上一级代码=1110
select
*
from
test a
where
exists(select 1 from test b where a.上一级代码=b.城市码)
and case when exists (select 1 from test where 上一级代码=@上一级代码 ) 
then 上一级代码 else [城市码] end=@上一级代码
/*
城市     城市码         上一级代码
------ ----------- -----------
西湖区    1111        1110
上城区    1112        1110

(2 行受影响)


*/



------解决方案--------------------
with cte as
(
   select 城市码 from tb where 上一级代码=1100
   union all
   select a.城市码 from tb a join cte b on a.上一级代码=b.城市码
)

select * from cte