2012-12-05 140 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