我不能很好地解释我想要做的事情,但是。
我有一个表A,它是我的表B中的一系列参数,包含每个用户及其权限。
活泉?
表用户 UserId,名称
表格参数
ParamterId,ParameterName
表格权限 PermissionId,ParameterId,UserId,X,Y,Z(X,Y,Z都是布尔值)
SO。我想要的是;所有参数的列表,每个用户,是否拥有其权限。
这就像是;
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对我来说并不是很好用,当用户没有获得许可时,它并没有为我提供所有参数...
BUT。
我设法做到了这一点;
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,Type
(类型将是包含X,Y和Z的枚举)。但是使用这种逻辑我会在查询所有权限时遇到更多问题,因此,我认为如果将它们放在一行中可能会更好。
我是否设法解释了我的问题以及我需要什么?
我还能做些什么,或者第二个查询工作正常吗?
感谢。
答案 0 :(得分:1)
SELECT
p.ParameterName,
pm.X,
pm.Y,
pm.Z
FROM Parameters p
LEFT JOIN Permissions pm ON pm.ParameterId = p.Id
AND (pm.UserId IS NULL OR pm.UserId = @UserId)