2012-12-05 139 views
0

我有三个表:SQL查询连接表

ProductPermission

  • 编号
  • 产品编号
  • PermissionName

SubscriptionPermission

  • 编号
  • ProductPermissionId
  • 授予
  • SubscriptionId

认购

  • 编号
  • 产品编号
  • SubscriptionName

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

这是我需要的信息:

 
+----------------+---------------------+---------+ 
| SubscriptionId | ProductPermissionId | Granted | 
+----------------+---------------------+---------+ 

你能帮助我吗? PS:如果您可以改进标题,请执行此操作。我真的不知道如何去问这个问题。

+0

标题看起来不错 - 有一个警告。标签[SQL]不应放置在标题中。 – MikeTheLiar

回答

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子句指定subscriptionid,但你需要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表,那将会很好。但是,像这样的东西应该工作。

+0

它看起来很有希望,但它会返回所有产品的权限,而不仅仅是订阅产品的权限。 – lontivero

+0

我懂了!问题是架构不完全如我所描述的(对于通常愚蠢的公司策略),但它已完成。我感谢你的帮助戈登。 – lontivero