首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

高分求一sql语句解决思路

2012-01-07 
高分求一sql语句表1--政府机关Viceidkeyidparentid电话传真办公时间131-111111123212222223331333333表2--

高分求一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

热点排行