I have a N-N table, lets say as an example Teachers and Subjects:
There is a Teacher table as follows:
+---------------+-----------------------+
| Id | Name |
+---------------+-----------------------+
| 1 | John Williams |
| 2 | Erika Miller |
+---------------+-----------------------+
There is a Subject table as follows:
+---------------+-----------------------+
| Id | Name |
+---------------+-----------------------+
| 1 | Music |
| 2 | Art |
| 3 | Languages |
| 4 | Geography |
+---------------+-----------------------+
And there is a TeacherTeachesSubject as follows:
+---------------+-----------------------+
| TeacherId | SubjectId |
+---------------+-----------------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 3 |
| 2 | 4 |
+---------------+-----------------------+
Only that each table has more than 10000 entries.
I need to make a query which returns me something like this:
+---------------+-----------------------+ | Teacher | SubjectsOfThatTeacher | +---------------+-----------------------+ | John Williams | Music, Art, Languages | | Erika Miller | Languages, Geography | +---------------+-----------------------+
What I am doing right now is:
SELECT * FROM Teachers;Save the results in an array.
Iterate over the array executing this query in each loop:
SELECT Name FROM Subjects inner join "everything" WHERE TeacherTeachesSubject.TeacherId = actualteacherid;
Save the results as String, separated with commas.
I’m making 10000 queries every time I want to select all data from the table.
Do you know any way of making this work efficiently? I don’t really need commas, I just need it to be in a String to show in a HTML column as a String.
Advertisement
Answer
With SQL Server 2017, use 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