【问题标题】:SQL INNER JOIN CASE SPECIFICSQL INNER JOIN 案例特定
【发布时间】:2013-07-20 05:03:25
【问题描述】:

下面是我的数据库表结构

ApplicationModule - ID、密钥、名称

ApplicationFeature - ID、ModuleId、密钥、名称

每个功能都映射到模块。此外,我只需要为租户分配一些功能。

TenantXFeature - TenantId、FeatureId

此外,当我创建角色时,我映射了从租户特定(TenantXFeature)中挑选的一些特征

RoleXFeature - RoleId、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 中有一个映射。

请建议/帮助我解决这个问题。

【问题讨论】:

  • 你有一个表格来将租户映射到角色吗?
  • @MarkBannister,我没有单独的映射表,但在 ApplicationRole 表中,我们有一个列 TenantId 表示角色特定于租户。该列中的NULL 值指定它对所有租户都是通用的。

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

可能没有任何功能同时与 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

【讨论】:

  • 作为对这个答案的交叉检查,将原始查询更改为使用 INNER JOIN。如果 RoleXFeature 中没有映射到 TenantId 为 1 和 RoleId 为 1 的行,则查询将不返回任何行。
  • 我检查了你的小提琴。我删除了一项数据并假设租户仅使用 3 个功能进行了映射。检查此sqlfiddle.com/#!3/ac83a/1。我现在需要的只是选择所有这 3 个功能以及所选的列,根据角色指示 1 或 0。在这种情况下,我应该使用 1 获得 Feature1,使用 0 获得其他人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2013-07-01
  • 2014-05-25
  • 2020-08-23
  • 2011-03-25
  • 2012-06-01
相关资源
最近更新 更多