2013-07-21 60 views
2

下面是我的數據庫表結構SQL INNER JOIN時的具體

ApplicationModule - 身份證,鑰匙,姓名

ApplicationFeature - 身份證,的moduleId,重點,名稱

每個特徵映射與模塊。此外,我只需將一些功能分配給租戶。

TenantXFeature - TenantId,FEATUREID

此外,當我創建一個角色,我繪製一些功能從特定於租戶的(TenantXFeature)

RoleXFeature採摘 - 角色ID,FEATUREID

現在我需要一個查詢如果RoleXFeature具有該功能的條目,則加載所有租戶特定功能以及選擇(是/否)。

SELECT AM.[Key] AS ModuleKey 
     ,AM.Name AS ModuleName 
     ,AF.[Key] AS FeatureKey 
     ,AF.Name FeatureName 
     ,RF.FeatureId 
     ,CASE WHEN RF.FeatureId IS NULL THEN 0 ELSE 1 END AS Selected 
    FROM TenantXFeature TF 
    INNER JOIN ApplicationFeature AF 
    ON TF.FeatureId = AF.Id 
    INNER JOIN ApplicationModule AM 
    ON AF.ModuleId = AM.Id 
    LEFT JOIN RoleXFeature RF 
    ON RF.FeatureId = AF.Id AND RF.RoleIid = 1 
    WHERE TF.TenantId = 1 

這裏RF.FeatureId總是顯示NULL即使我在RoleXFeature中有一個映射。

請建議/幫我解決這個問題。

+0

你有一張表來將租戶映射到角色? –

+0

@MarkBannister,我沒有一個單獨的映射表,但在ApplicationRole表中我們有一列'TenantId'表示角色是特定於Tenant的。該列中的「NULL」值指定它對所有租戶都是通用的。 – Billa

回答

0

也許沒有同時涉及與ID = 1,ID爲租戶角色特點= 1

特點不相關的角色ID = 1或租戶ID = 1:

SELECT * 
FROM ApplicationFeature f 
WHERE (NOT EXISTS(SELECT 1 FROM TenantXFeature WHERE FeatureId = f.Id AND TenantId=1) 
OR NOT EXISTS(SELECT 1 FROM RoleXFeature WHERE FeatureId = f.Id AND RoleId=1)) 

特點有關既角色ID = 1個租戶ID = 1:

SELECT * 
FROM ApplicationFeature f 
WHERE EXISTS(SELECT 1 FROM TenantXFeature WHERE FeatureId = f.Id AND TenantId=1) 
AND EXISTS(SELECT 1 FROM RoleXFeature WHERE FeatureId = f.Id AND RoleId=1) 

Playground on SQLFiddle

+0

作爲對此答案的交叉檢查,將原始查詢更改爲使用INNER JOIN。如果RoleXFeature中沒有行映射到TenantId爲1且RoleId爲1的行,則查詢將不返回任何行。 –

+0

我檢查了你的小提琴。我刪除了一個數據,並假設Tenant只映射了3個特徵。檢查這個http://sqlfiddle.com/#!3/ac83a/1。我所需要的是現在我應該選擇所有這3個功能以及所選的列,根據角色指示1或0。在這種情況下,我應該使用'1'和其他使用'0' – Billa

+0

的Feature1,所以它是... http://sqlfiddle.com/#!3/ac83a/3 –