Retour des données groupées avec une ligne supplémentaire pour chaque groupe dans SQL Server

J'ai des arrays Composition, CompositionDétails et Pistes
La composition contient le nom de composition alors que compositionDetails est pour mapper des pistes avec composition. Une composition peut avoir plusieurs pistes.

Les structures de tableau sont comme ceci:

Tableau de composition – CompositionId, CompositionName
Table des pistes – TrackId, TrackName
CompositionDetails – CompositionId (FK), TrackId (FK)

Maintenant, avec Ma requête, je suis capable de réaliser ceci:

entrez la description de l'image ici

Mais je veux ceci:

entrez la description de l'image ici

Je veux dire une rangée supplémentaire au-dessus de chaque groupe de composition.
Je l'ai réalisé en créant des tables temporaires et en bouclant pour insert une rangée supplémentaire. Mais avec des millions de données, c'est très lent.

Toutes les suggestions sur comment pouvez-vous y parvenir sans créer de table temporaire et aller en boucle pour insert de nouvelles lignes?

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 

Essaye ça

 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 

En supposant que la table CompositionDetails n'a pas de lignes avec des valeurs NULL dans la colonne TrackId :

  1. En utilisant UNION , ajoutez un TrackId vide (NULL) par CompositionId dans CompositionDetails .

  2. Inner-join l'set résultant à la Composition .

  3. Gauche-join le résultat de la jointure interne avec des Tracks . Évidemment, cela donnera des noms de piste NULL pour les lignes ajoutées au # 1.

  4. Dans la clause ORDER BY, sortinger par nom de CompositionName abord, puis par TrackName de TrackName . (Dans Transact-SQL, les valeurs NULL sont placées avant les valeurs, ce qui signifie que les lignes contenant des noms de pistes vides seront placées avant les autres dans leurs groupes respectifs.)

  5. Dans la clause SELECT, utilisez COALESCE ou ISNULL pour replace les noms de pistes vides par des noms de composition.

 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 ;