2
votes

Sélection de toutes les lignes étrangères pour chaque ligne à l'aide d'une table N

J'ai une table NN, disons à titre d'exemple Enseignants et Matières:

Il existe une table Enseignant comme suit:

SELECT Name 
FROM Subjects inner join "everything" 
WHERE TeacherTeachesSubject.TeacherId = actualteacherid;

Il y a un tableau Subject comme suit:

+---------------+-----------------------+
|    Teacher    | SubjectsOfThatTeacher |
+---------------+-----------------------+
| John Williams | Music, Art, Languages |
| Erika Miller  | Languages, Geography  |
+---------------+-----------------------+

Et il y a un TeacherTeachesSubject comme suit:

    +---------------+-----------------------+
    |  TeacherId    |        SubjectId      |
    +---------------+-----------------------+
    | 1             | 1                     |
    | 1             | 2                     |
    | 1             | 3                     |
    | 2             | 3                     |
    | 2             | 4                     |
    +---------------+-----------------------+

Seulement que chaque table a plus de 10000 entrées.

J'ai besoin de faire une requête qui me renvoie quelque chose comme ceci:

    +---------------+-----------------------+
    |    Id         | Name                  |
    +---------------+-----------------------+
    | 1             | Music                 |
    | 2             | Art                   |
    | 3             | Languages             |
    | 4             | Geography             |
    +---------------+-----------------------+


2 commentaires

Utilisez-vous SQL Server ou Oracle? - vous avez marqué les deux.


@Nick Désolé, corrigé.


3 Réponses :


5
votes

Avec SQL Server 2017, utilisez STRING_AGG () :

SELECT t.Name, STRING_AGG(s.Name, ', ') SubjectsOfThatTeacher
FROM Teacher t
INNER JOIN TeacherTeachesSubject tts ON tts.TeacherId = t.Id
INNER JOIN Subject s ON s.Id = tts.SubjectId
GROUP BY t.Id, t.Name


0 commentaires

4
votes

Pour la version antérieure à SQL Server 2017, il existe le FORXML et STUFF piratage:

SELECT t.Name, SubjectsOfThatTeacher = STUFF(
                                   (SELECT ',' + s.Name 
                                    FROM TeacherTeachesSubject tts 
                                    INNER JOIN Subject s ON s.Id = tts.SubjectId
                                    WHERE tts.TeacherId = t.Id
                                    FOR XML PATH(''))
                                    ,1,1,'')
FROM Teacher t
GROUP BY t.Id, t.Name


1 commentaires

Il suffit d'ajouter un article qui explique cette méthode sqlservercentral.com/articles/comma+separated + liste / 71700



0
votes

Utilisez les agrégats GROUP_CONCAT pour les versions antérieures à SQL Server 2017. Disponible sur Github

Télécharger GROUP_CONCAT


0 commentaires