2013-03-24 60 views
2

我有表格組成,組成和詳細信息
組合保存組合名稱,而compositionDetails用於映射具有合成的軌道。一個作曲可以有多個曲目。在SQL Server中爲每個組返回分組數據和額外行

表結構是這樣的:

組成表 - CompositionId,CompositionName
曲目表 - 的TrackID,TRACKNAME
CompositionDetails - CompositionId(FK),的TrackID(FK)

現在我的查詢我能夠做到這一點:

enter image description here

但我想這一點:

enter image description here

我的意思是一個額外的行各組的組合物上方。
我實現它創建臨時表和循環插入額外的行。但數據有數百萬,速度很慢。

有關如何在不創建臨時表和循環插入新行的情況下實現此目的的任何建議?

回答

2
Select Componame,TrackTitle from 
(
Select Componame,TrackTitle,Componame as h,1 as Sort 
from Composition 
UNION 
Select Componame,Componame,MIN(Componame),0 as Sort 
from Composition 
group by Componame 
) a 
Order by h,Sort,Componame,TrackTitle 
+0

一個'Componame'情況下,當然可以倖免。 :)我敢肯定,如果子選擇符只生成「Componame,TrackTitle,Sort」這些列,那麼您可以通過「Componame,Sort,TrackTitle」進行排序。無論如何,我認爲你也過分簡化了你的答案,也沒有解釋OP如何將它與* 3 *表一起使用。 – 2013-03-27 12:20:05

0

試試這個

SELECT c2.CompositionName, c2.CompositionName, c2.CompositionId 
FROM Composition c2 
UNION 
SELECT c.CompositionName, t.TrackName, cd.CompositionId 
FROM CompositionDetails cd join Composition c ON cd.CompositionId = c.CompositionId 
JOIN Tracks t on t.Trackid = cd.Trackid 
+0

非常感謝 – asimsuvedi 2013-04-06 14:46:15

0

假設CompositionDetails表沒有用在TrackId列空值行:

  1. 使用UNION,添加一個空(NULL)TrackIdCompositionId納入CompositionDetails

  2. 將生成的集合內部連接到Composition

  3. 左連接內部連接的結果與Tracks。顯然,這將爲在#1中添加的行生成NULL軌道名稱。

  4. 在ORDER BY子句中,首先按CompositionName排序,然後按TrackName排序。 (在Transact-SQL,NULL值走之前的任何值。因此,空白的曲目名稱的行會的人在各自組之前去了。)

  5. 在SELECT子句中,使用COALESCEISNULL更換空白曲目名稱與組成名稱。

SELECT 
    c.CompositionName, 
    COALESCE(t.TrackName, c.CompositionName) 
FROM 
    Composition AS c 
    INNER JOIN (
    SELECT   CompositionId, TrackId FROM CompositionDetails 
    UNION ALL 
    SELECT DISTINCT CompositionId, NULL FROM CompositionDetails 
) AS d ON c.CompositionId = d.CompositionId 
    LEFT JOIN Tracks AS t ON d.TrackId = t.TrackId 
ORDER BY 
    c.CompositionName, 
    t.TrackName 
;