2010-05-26 93 views
1

SQL樞軸幫助: 我有三個表如下: 類表:SQl的樞軸幫助多個表

ID Name 
1 N1 
2 N2 
3 N3 

標誌表:

ID ClassID Flags 
1  1  F1 
1  1  F2 
1  2  F3 
1  3  F1 
1  3  F3 

會議表:

ID ClassID Session 
1  1  S1 
2  1  S2 
3  1  S3 
4  2  S2 
5  2  S5 
6  3  S1 
6  3  S2 

現在我需要創建一個視圖是這樣的:

類視圖:

ID Name  Flags  Session 
1 N1  F1,F2  S1,S2,S3 
2 N2   F3   S2,S5 
3 N3  F1,F3   S1,S2 
+1

PIVOT是一回事,幾乎每個數據庫實現不同。沒有指定數據庫和版本,如果對這個問題有任何迴應,你很可能會得到很少。 – 2010-05-26 14:56:32

回答

2

最好的方法是創建逗號分隔列表中的客戶端的表示層。你可以加入表在一起,就像:

select 
    class.id 
, class.name 
, flags.flags 
, session.session 
from class 
left join flags on flags.classid = class.id 
left join session on session.classid = class.id 

雖然數據庫並不意味着格式的數據,大多數數據庫支持生成逗號某種方式分開列出。例如,在MySQL中,你可以使用group_concat

select 
    class.id 
, class.name 
, group_concat(flags.flags separator ',') 
, group_concat(session.session separator ',') 
from class 
left join flags on flags.classid = class.id 
left join session on session.classid = class.id 
group by class.id, class.name 

如果你使用其他DMBS,請把它添加到你的問題。

+0

我正在使用SQL Server。這會工作嗎? – 2010-05-26 15:54:36

+2

對於SQL Server,通常的方法是'for xml'技巧,請參閱http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html – Andomar 2010-05-26 16:06:18

+0

+1提供寶貴信息。 – 2010-05-26 18:16:15

1

this SO question,我想通了以下內容:

select fs.ClassId 
    , fs.ClassName 
    , LEFT(fs.Flags, LEN(fs.Flags) - 2) as Flags 
    , LEFT(fs.Sessions, LEN(fs.Sessions) - 2) as Sessions 
from (
    select c.Id as ClassId 
      , c.[Name] as ClassName 
      , (
       select Flags + N', ' as [text()] 
        from FlagsTable 
        where ClassId = c.Id 
        FOR XML PATH (N'') 
      ) as Flags 
      , (
       select Session + N', ' as [text()] 
        from SessionTable 
        where ClassId = c.Id 
        FOR XML PATH (N'') 
      ) as Sessions 
     from ClassTable c 
    ) fs