2016-09-29 29 views
1

我不能很好地解释我正在尝试做什么,但是。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的枚举)。但是使用这个逻辑我会遇到更多的问题,所有的权限一起查询,所以,我认为如果我把它们放在一个单独的行中可能会更好。

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

有什么我可以做或第二个查询工作得很好吗?

感谢。

+0

先看看LEFT JOIN错了,它应该LEFT JOIN权限下午pm.ParameterId = p.Id –

回答

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) 
+0

弗里克。我很尴尬。我做了所有错误的条款,至少我的心是正确的,哈哈。谢谢。我会尽快接受这一点。 – Morilon

相关问题