2013-07-21 2 views
2

Ниже моя база данных таблицы структураSQL INNER JOIN каждого конкретного случая

ApplicationModule - Id, ключ, имя

ApplicationFeature - Id, ModuleId, ключ, имя

Каждая функция отображается с модулем. Также мне нужно назначить только некоторые функции Арендатору.

TenantXFeature - TenantId, FeatureId

Кроме того, когда я создаю роль, я карту несколько особенностей, выбрал из специфичным для арендатора (TenantXFeature)

RoleXFeature - Идентификатор роли, FeatureId

Теперь мне нужен запрос к загрузите все специфические функции арендатора вместе с выбором (Y/N), если 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

Вероятно, нет никаких особенностей, связанных одновременно с ролью с идентификатором = 1 и арендаторы с идентификатором = 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)) 

Особенности относится как к роли ид = 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

Я проверил твою скрипку. Я удалил одну информацию и предположил, что Арендатор получил сопоставление только с 3-мя функциями. Проверьте это http://sqlfiddle.com/#!3/ac83a/1. Все, что мне нужно, теперь я должен выбрать все эти 3 функции вместе с выбранным столбцом, который указывает 1 или 0 на основе роли. В этом случае я должен получить Feature1 с '1' и другими с' 0' – Billa

+0

, так что это ... http://sqlfiddle.com/#!3/ac83a/3 –