【发布时间】:2016-09-29 21:06:55
【问题描述】:
我不能很好地解释我要做什么,但是。
我有一个表 A,它是我的表 B 的一系列参数,其中包含每个用户及其权限。
Wood?
表用户
用户 ID、名称
表格参数
参数Id,参数名称
表权限
PermissionId、ParameterId、UserId、X、Y、Z(X、Y、Z都是布尔值)
所以。我想要的是;所有参数的列表,每个用户,有或没有,它的权限。
应该是这样的;
SELECT
p.ParameterName,
pm.X,
pm.Y,
pm.Z
FROM Parameters p
LEFT JOIN Permissions pm ON pm.PermissionId = p.Id
AND (pm.UserId IS NULL OR pm.UserId = @UserId)
基本上,我想要所有参数,并且我需要知道我提供的用户是否拥有每个特定参数的权限。
LEFT JOIN 对我来说效果不是很好,当用户没有权限时,它不会让我获得所有参数...
但是。
我设法做到了;
SELECT
p.ParameterName,
(SELECT X FROM Permissions WHERE ParameterId = p.Id And UserId = @UserId) [X]
-- *repeat logic for Y and Z*
FROM Parameters p
第二个查询运行良好,但我知道它在质量和性能上都不是很好。我不知道我的表结构是否是我能做的最好的。
我考虑过每行都做,而不是在一行中做所有权限类型。
类似的东西。
实际 - 权限
PermissionId, ParameterId, UserId, X, Y, Z. (XYZ bit/boolean)
我首先想到的东西 - 权限
PermissionId、ParameterId、UserId、类型
(类型将是一个包含 X、Y 和 Z 的枚举)。但是使用这种逻辑我会在查询所有权限时遇到更多问题,因此,我认为如果我将它们放在一行中会更好。
我是否设法解释了我的问题以及我需要什么?
还有什么我可以做的,或者第二个查询可以正常工作吗?
谢谢。
【问题讨论】:
-
乍一看LEFT JOIN不对应该是LEFT JOIN Permissions pm ON pm.ParameterId= p.Id
标签: sql-server