2016-09-29 57 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

相關問題