SQL多列子表查询,及内容拆分成多行

一.数据库表格式

1.用户信息表



2.对应管理员矩阵



二.查询运行结果

//先查询特殊人员列,再按正常规则查找
select manage from groupInfo where other='张三'
union all
SELECT manage FROM groupInfo 
WHERE EXISTS (select groupid, lv from userInfo 
where (userInfo.name='张三' and groupInfo.groupid=userInfo.groupid and groupInfo.lv = userInfo.lv))



//将查找到的人员字段,转成xml,再用slq xml操作语句,按逗号分拆成多行,只有sql server才支持这样做
SELECT    B.manage
FROM ( SELECT manage=CONVERT(XML , '<v>' + REPLACE(myInfo.manage , ',' , '</v><v>') + '</v>')
from (
select manage from groupInfo where other='张三'
union all
SELECT manage FROM groupInfo 
WHERE EXISTS (select groupid, lv from userInfo 
where (userInfo.name='张三' and groupInfo.groupid=userInfo.groupid and groupInfo.lv = userInfo.lv))
) as myInfo
) A
CROSS APPLY ( SELECT   manage= N.v.value('.' , 'varchar(100)')
FROM A.manage.nodes('/v') N ( v )
) B



//先查询人员是否在特殊人员列,是的话直接返回对应上级领导,如果不在物殊人员列,照正情规则查找
select isnull(t1.manage1,t2.manage2) as '上级领导' from
(select manage as manage1 from groupInfo where other='张三') as t1
full join
(SELECT manage as manage2 FROM groupInfo 
WHERE EXISTS (select id from userInfo 
where (userInfo.name='张三' and groupInfo.groupid=userInfo.groupid and groupInfo.lv = userInfo.lv))) as t2
on 1=1



猜你喜欢

转载自blog.csdn.net/stwuyiyu/article/details/78710003