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 |
+---------------+-----------------------+
3 Réponses :
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
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
Il suffit d'ajouter un article qui explique cette méthode sqlservercentral.com/articles/comma+separated + liste / 71700
Utilisez les agrégats GROUP_CONCAT pour les versions antérieures à SQL Server 2017. Disponible sur Github
Utilisez-vous SQL Server ou Oracle? - vous avez marqué les deux.
@Nick Désolé, corrigé.