我不能很好地解释我正在尝试做什么,但是。TSQL - 查询列表A和B的列,左连接,保持主表
我有一个表A,它是我的表B的一系列参数,包含每个用户及其权限。
Woot?
表用户
用户ID,名称
表参数
ParamterId,参数名称
表权限
PermissionId,参数标识,用户ID,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,参数标识,用户ID,X,Y,Z。(XYZ位/布尔值)
东西我首先想到 - 权限 PermissionId,参数标识,用户ID,类型
(类型应该是一个包含X,Y和Z的枚举)。但是使用这个逻辑我会遇到更多的问题,所有的权限一起查询,所以,我认为如果我把它们放在一个单独的行中可能会更好。
我是否设法解释我的问题以及我需要什么?
有什么我可以做或第二个查询工作得很好吗?
感谢。
先看看LEFT JOIN错了,它应该LEFT JOIN权限下午pm.ParameterId = p.Id –