2

私はテーブルComposition、CompositionDetails、Tracksを持っています。Composition
はcomposition Nameを保持し、compositionDetailsはコンポジションでトラックをマッピングするためのものです。1つのコンポジションに複数のトラックを含めることができます。

テーブル構造は次のようになります。

コンポジションテーブル-CompositionId、 CompositionName
トラックテーブル-TrackId、TrackName
CompositionDetails -CompositionId(FK)、TrackId(FK)

今私のクエリでこれを達成することができます:

ここに画像の説明を入力してください

しかし、私はこれが欲しい:

ここに画像の説明を入力してください

構成の各グループの上に1行余分にあることを意味します。
一時テーブルを作成し、ループして余分な行を挿入することを実現しました。しかし、何百万ものデータがあるため、非常に低速です。

一時テーブルを作成したり、ループを超えて新しい行を挿入したりせずに、これを実現する方法についての提案はありますか?

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

これを試して

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 に答える
0

CompositionDetailsテーブルの列にNULLを含む行がないと仮定しTrackIdます。

  1. を使用して、に1UNIONつの空白(NULL)を追加します。TrackIdCompositionIdCompositionDetails

  2. 結果のセットをに内部結合しCompositionます。

  3. 左-内部結合の結果を。で結合しTracksます。明らかに、これにより、#1で追加された行のトラック名がNULLになります。

  4. ORDER BY句で、CompositionName最初に並べ替え、次に。で並べ替えますTrackName。(Transact-SQLでは、NULLは値の前に配置されます。したがって、トラック名が空白の行は、それぞれのグループ内の他の行の前に配置されます。)

  5. SELECT句で、COALESCEまたはISNULLを使用して、空白のトラック名をコンポジション名に置き換えます。

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 に答える