我有表格Composition,CompositionDetails和Tracks
组合持有组合名称,而compositionDetails用于映射具有组合的轨道。一个作品可以有多个曲目。
表结构如下:
撰写表 - CompositionId,CompositionName
曲目表 - TrackId,TrackName
CompositionDetails - CompositionId(FK),TrackId(FK)
现在通过我的查询,我能够实现这一目标:
但我想要这个:
我的意思是每组构图上方多一行。
我实现了创建临时表和循环以插入额外的行。但是有数百万的数据,它很慢。
有关如何在不创建临时表和重复循环以插入新行的情况下如何实现此目的的任何建议?
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
假设CompositionDetails
表在TrackId
列中没有包含NULL的行:
使用UNION
,将每TrackId
的空格(NULL)CompositionId
添加到CompositionDetails
。
将结果集合内连接到Composition
。
使用Tracks
左连接内部联接的结果。显然,这将为#1中添加的行生成NULL轨道名称。
在ORDER BY子句中,先按CompositionName
排序,然后按TrackName
排序。 (在Transact-SQL中,NULL在任何值之前。因此,具有空白轨道名称的行将在其各自组中的其他行之前。)
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
;