SQL#三表联查和动态行转列

功能需求:Permission,Role,Role_Permission三个表的联合查询显示。

Role表:

Permission表

 

 Role_Permission表

 需求展示三表联合查询每个权限每个角色是否有权限:

根据需求需要进行三表联合查询,然后使用group by 和聚合函数进行分组,角色行转列

select ID,PermissionName,PLCAddress,
sum(生产操作员) as 生产操作员,
sum(生产技师) as 生产技师,sum(ME工程师) as ME工程师,sum(ME技术员) as ME技术员,
sum(供应商初级调试) as 供应商初级调试,sum(供应商高级调试) as 供应商高级调试
from(select a.ID,a.PermissionName,a.PLCAddress,c.RoleName, b.PermissionValue,
MAX(CASE RoleName WHEN '生产操作员' THEN PermissionValue ELSE 0 END) AS '生产操作员',
MAX(CASE RoleName WHEN '生产技师' THEN PermissionValue ELSE 0 END) AS '生产技师',
MAX(CASE RoleName WHEN 'ME工程师' THEN PermissionValue ELSE 0 END) AS 'ME工程师',
MAX(CASE RoleName WHEN 'ME技术员' THEN PermissionValue ELSE 0 END) AS 'ME技术员',
MAX(CASE RoleName WHEN '供应商初级调试' THEN PermissionValue ELSE 0 END) AS '供应商初级调试',
MAX(CASE RoleName WHEN '供应商高级调试' THEN PermissionValue ELSE 0 END) AS '供应商高级调试'
from GeeSun_Permission as a
left join GeeSun_Role_Permisson as b
on a.ID=b.PermissionId
left join GeeSun_Role as c
on b.RoleId=c.ID
group by a.ID,a.PermissionName,a.PLCAddress,c.RoleName, b.PermissionValue
) T
group by ID,PermissionName,PLCAddress,PermissionValue

但是上述SQL中角色的名称和数量是写死的,如果角色表的角色名称发生变化,或者新增、删除了角色,都需要进行SQL更改,不符合程序设计的开闭原则。进行优化后如下,实现了角色表的动态拼接功能。

DECLARE @cmdText    VARCHAR(8000);
DECLARE @tmpSql        VARCHAR(8000);
SET @cmdText = 'select ID,PermissionName,PLCAddress,' + CHAR(10);
SELECT @cmdText = @cmdText + ' sum(' +rolename+') as '+rolename +','+ CHAR(10)  FROM (SELECT DISTINCT top 100 ID,rolename FROM geesun_role order by ID ) T
SET @cmdText = LEFT(@cmdText, LEN(@cmdText) -2)
SET @cmdText = @cmdText + ' FROM(select a.ID,a.PermissionName,a.PLCAddress,c.RoleName, b.PermissionValue,';
SET @tmpSql =' ' + CHAR(10);
SELECT @tmpSql = @tmpSql + ' MAX(CASE RoleName WHEN '''+rolename+''' THEN PermissionValue ELSE 0 END) AS '''
+ rolename+''',' + CHAR(10) FROM  (SELECT DISTINCT top 100 ID,rolename FROM geesun_role order by ID  ) T
SET @tmpSql = LEFT(@tmpSql, LEN(@tmpSql) -2)
SET @cmdText =@cmdText  +  @tmpSql+ 
' from GeeSun_Permission as a
left join GeeSun_Role_Permisson as b
on a.ID=b.PermissionId
left join GeeSun_Role as c
on b.RoleId=c.ID
group by a.ID,a.PermissionName,a.PLCAddress,c.RoleName, b.PermissionValue
) T
group by ID,PermissionName,PLCAddress,PermissionValue ';
EXECUTE (@cmdText);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值