读书人

高分求一sql语句解决思路

发布时间: 2012-01-07 21:41:55 作者: rapoo

高分求一sql语句
表1 --政府机关
Viceid keyid parentid 电话 传真 办公时间
1 31 -1 11 11 11
2 32 1 22 22 22
3 33 1 33 33 33
表2 --政府机关_组织机构
subdeptid viceid 名称 职能
1 1 组织部 111
2 2 法制课 222
3 3 政治部 333
4 1 政治部 333
5 1 法制课 222
表3 --主数据
keyid city name address
31 北京 北京市公安局 8888
32 北京 朝阳区公安局 9999
33 北京 海淀区公安局 0000
其中表1 表2 viceid关联
表1 表3 keyid关联
表1 parentid是引用viceid,成树结构
结果:
北京市公安局
组织部 111
政治部 333
法制课 222
朝阳区公安局
法制课 222
海淀区公安局
政治部 333
如果没有下属部门,只显示自己的组织机构。
如:北京市公安局下有各个区的公安局,市公安局有自己的组织机构,
而区公安局也有自己的组织机构


[解决办法]
--测试环境
declare @table1 table
(
viceId int,
keyId int,
parentId int
)

declare @table2 table
(
stbdeptId int,
viceId int,
名称 varchar(50)
)

declare @table3 table
(
keyId int,
city varchar(20),
name varchar(50)
)

insert into @table1 values (1, 31, -1)
insert into @table1 values (2, 32, 1)
insert into @table1 values (3, 33, 1)

insert into @table2 values (1, 1, '组织部 ')
insert into @table2 values (2, 2, '法制课 ')
insert into @table2 values (3, 3, '政治部 ')
insert into @table2 values (4, 1, '政治部 ')
insert into @table2 values (5, 1, '法制课 ')

insert into @table3 values (31, '北京 ', '北京市公安局 ')


insert into @table3 values (32, '北京 ', '朝阳区公安局 ')
insert into @table3 values (33, '北京 ', '海淀区公安局 ')


--执行语句,可以写成存储过程调用。
declare @keyId int

set @keyId = 31

declare @result table
(
viceId int,
name varchar(50),
flag bit
)

insert into @result
select viceId, name, 0 from
(
select * from @table1 a where a.keyId = @keyId
union
select b.* from @table1 a
left join @table1 b on a.viceId = b.parentId
where a.keyId = 31
) a
left join @table3 b on a.keyid = b.keyid

insert into @result
select b.viceId, 名称, 1 from @result a left join @table2 b on a.viceId = b.viceId

select * from @result order by viceId, flag

读书人网 >SQL Server

热点推荐