我一直在各种各样的场地工作,我以为我用之前的问题解决了这个问题,而且进一步的搜索还没有结果。
快速而肮脏:我在SQL 2012中的单个表中有一组值,我希望所有值都显示在屏幕左侧的列中。然后我想要一个变量,它可以有多个值,如果与左边的列匹配则运行并显示。我无法在SQL中使我的查询正常工作,但最终会在SSRS报告中显示。
@GroupName是从可用组名动态提取的SSRS报告中的参数。比较所需的数据存储在三个不同的表中,我无法修改数据库,因为它是COTS产品。
Priv_Table包含可以分配的权限(登录,控制a等)及其关联ID# Info_Table包含组的名称和组ID# Prof_info_Table包含与各个Priv id#信息匹配的组ID#。在下面的示例中,组1的ID将列出三次,每次都与唯一的Priv id#相关联。 (例如1-1,1-2,1-4)
Group 1 Group 2 Group 3 Group 4
Log In X X X X
Control A X X
Control B X
Control C X X
Delete A X
Delete B
Delete C X
在上面的示例中,如果我选择Group 1作为要查询的组,则我现有的查询只会返回左侧的Log In,Control A和Control C.如果我用第1组和第1组运行它第3组然后控制B将按预期在第1组列中显示空白。但是,无论选择哪个组进行查询,我都希望显示所有选项。
我看到前进的两种方法,找出一种方法来拉取所有数据(可能在子查询中)以始终填充一列,然后针对子查询执行case语句以显示所需结果或修复现有查询。 / p>
这是我到目前为止所遇到的问题以及每个问题:
SELECT Priv_Table.PrivilegeDesc, Info_Table.ProfileName, CASE WHEN
Priv_Table.PrivilegeDesc LIKE '%' THEN 'Granted' END AS PermissionHeld
FROM Priv_Table LEFT OUTER JOIN
Prof_Info_Table ON Priv_Table.PrivilegeID = Prof_Info_Table.PrivilegeID INNER JOIN
Info_Table ON Prof_Info_Table.ProfileID = Info_Table.ProfileID
WHERE (Info_Table.ProfileName IN (@GroupName))
ORDER BY Priv_Table.PrivilegeID
这是我目前正在使用的查询,如上例所示。我在SQL和SSRS中得到了相同的行为,我尝试了所有不同的联接并删除了case语句,但它仍然会发生。
如果我运行此查询,那么我将获得权限的所有可能值:
SELECT Priv_Table.PrivilegeDesc
FROM Priv_Table
我已经尝试将其作为SSRS中的子报告包含在SSRS中,但是我无法使用该配置完全匹配。
SELECT Priv_Table.PrivilegeDesc, Info_Table.ProfileName, CASE WHEN Exists
(SELECT Priv_Table.PrivilegeDesc, Info_Table.ProfileName FROM Priv_Table Left Outer Join
Prof_Info_Table ON Priv_Table.PrivilegeID = Prof_Info_Table.PrivilegeID INNER JOIN
Info_Table ON Prof_Info_Table.ProfileID = Info_Table.ProfileID WHERE
Priv_Table.PrivilegeDesc like '%' ) THEN 'Granted' ELSE NULL END AS 'PermissionHeld'
From Priv_Table, Info_Table
WHERE (Info_Table.ProfileName IN (@GroupName))
此查询返回最左侧列中的所有值,但是显示所有权限(包括该组无权访问的权限)的已授予(或示例中的X)。因此,使用上面的示例,组1将在所有行中使用X,即使它只应该登录,控制a和控制C。
答案 0 :(得分:1)
在您的查询中,您有一个左连接,后跟一个内连接。内连接也有效地将Left Join转换为Inner Join。
这可能是您问题的一部分,但如果没有样本数据则很难说清楚。
另一个选项是,创建一个不同的权限列表,然后保持联接到您的结果。
SELECT *
FROM (
SELECT DISTINCT Priv_Table.PrivilegeDesc,
FROM Priv_Table
) AS PT
LEFT OUTER JOIN (
SELECT Priv_Table.PrivilegeDesc,
Info_Table.ProfileName,
PermissionHeld = CASE
WHEN Priv_Table.PrivilegeDesc LIKE '%' THEN 'Granted'
END
FROM Priv_Table
LEFT OUTER JOIN Prof_Info_Table
ON Priv_Table.PrivilegeID = Prof_Info_Table.PrivilegeID
INNER JOIN Info_Table
ON Prof_Info_Table.ProfileID = Info_Table.ProfileID
WHERE (Info_Table.ProfileName IN ( @GroupName ))
) AS Profiles
ON PT.PrivilegeDesc = Profiles.PrivilegeDesc