0

我有三张桌子:

产品许可

  • ID
  • 产品编号
  • 权限名称

订阅许可

  • ID
  • 产品权限 ID
  • 的确
  • 订阅 ID

订阅

  • ID
  • 产品编号
  • 订阅名称

关键是给定一个指定的 SubscriptionId,我需要为每个 ProductPermission 显示。我的意思是,假设一个产品有 30 种权限类型,并且该产品的订阅分配了 20 个权限,我想要显示 30 个权限,授予的列可以是 0、1 或 NULL。

这是我需要的信息:

+----------------+---------------------+---------+
| 订阅号 | 产品权限 ID | 授予 |
+----------------+---------------------+---------+

请问你能帮帮我吗?

PS:如果你能改进标题,请做。我真的不知道怎么问这个。

4

1 回答 1

0

您需要一个包含所有组合的驱动程序表来连接您拥有的数据:

select allcombos.subscriptionId, allcombos.ProductPermissionId,
       sp.granted
from (select SubscriptionId, ProductPermissionId
      from subscription s cross join ProductPermission pp
     ) allcombos left outer join
     SubscriptoinPermission sp
     on sp.subscriptionId = allcombos.subscriptionId and
        sp.ProductionPermissionId = allcombos.ProductPermissionId

您可以添加一个where子句来指定订阅 ID,但您需要在其前面加上 allcombos:

where allcombos.SubscriptionId = <whatever>

如果您只希望它用于订阅产品,则更改 allcombos 子查询:

select allcombos.subscriptionId, allcombos.ProductPermissionId,
       sp.granted
from (select distinct SubscriptionId, pp2.ProductPermission
      from subscriptionProduct sp join
           ProductPermission pp
           on sp.ProductPermissionId = pp.ProductPermissionId left outer join
           ProductionPermission pp2
           on pp.ProductId = pp2.ProductId
     ) allcombos left outer join
     SubscriptionPermission sp
     on sp.subscriptionId = allcombos.subscriptionId and
        sp.ProductionPermissionId = allcombos.ProductPermissionId

这可能不是获得订阅中产品的所有权限的最干净的更改。如果您有一个 SubscriptionProduct 表,那就太好了。但是,这样的事情应该有效。

于 2012-12-05T15:18:20.780 回答