TSQL - 查询列出A和B的列,左连接,保留主表

时间:2016-09-29 13:03:31

标签: sql-server

我不能很好地解释我想要做的事情,但是。

我有一个表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的枚举)。但是使用这种逻辑我会在查询所有权限时遇到更多问题,因此,我认为如果将它们放在一行中可能会更好。

我是否设法解释了我的问题以及我需要什么?

我还能做些什么,或者第二个查询工作正常吗?

感谢。

1 个答案:

答案 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)