2

我有表 Composition、CompositionDetails 和 Tracks
Composition 包含组成名称,而 compositionDetails 用于映射轨道与组成。一个作品可以有多个轨道。

表结构是这样的:

合成表 - CompositionId、CompositionName
轨道表 - TrackId、TrackName
CompositionDetails - CompositionId (FK)、TrackId (FK)

现在通过我的查询,我能够实现这一点:

在此处输入图像描述

但我想要这个:

在此处输入图像描述

我的意思是每组作文上方多出一行。
我实现了它创建临时表并循环插入额外的行。但是有数百万的数据,它非常慢。

关于如何在不创建临时表和遍历循环插入新行的情况下实现这一点的任何建议?

4

3 回答 3

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
于 2013-03-24T10:47:07.267 回答
0

假设CompositionDetails表的列中没有包含 NULL 的TrackId行:

  1. 使用,将每个UNION空白 (NULL) 添加到中。TrackIdCompositionIdCompositionDetails

  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
;
于 2013-03-27T12:10:05.263 回答
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
于 2013-03-25T05:44:19.973 回答