我有一个 N-N 表,举个例子,教师和科目:
有一个Teacher
表如下:
+---------------+-----------------------+
| Id | Name |
+---------------+-----------------------+
| 1 | John Williams |
| 2 | Erika Miller |
+---------------+-----------------------+
有一个Subject
表如下:
+---------------+-----------------------+
| Id | Name |
+---------------+-----------------------+
| 1 | Music |
| 2 | Art |
| 3 | Languages |
| 4 | Geography |
+---------------+-----------------------+
还有一个TeacherTeachesSubject
如下:
+---------------+-----------------------+
| TeacherId | SubjectId |
+---------------+-----------------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 3 |
| 2 | 4 |
+---------------+-----------------------+
只有每个表的条目数超过 10000。
我需要进行一个查询,返回如下内容:
+---------------+-----------------------+
| Teacher | SubjectsOfThatTeacher |
+---------------+-----------------------+
| John Williams | Music, Art, Languages |
| Erika Miller | Languages, Geography |
+---------------+-----------------------+
我现在正在做的是:
SELECT * FROM Teachers;
将结果保存在数组中。
在每个循环中迭代执行此查询的数组:
SELECT Name FROM Subjects inner join "everything" WHERE TeacherTeachesSubject.TeacherId = actualteacherid;
将结果保存为字符串,以逗号分隔。
每次我想从表中选择所有数据时,我都会进行 10000 次查询。
你知道有什么方法可以让这项工作更有效率吗?我真的不需要逗号,我只需要它位于字符串中以在 HTML 列中显示为字符串。
最佳答案
对于 SQL Server 2017,使用 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
关于sql - 使用 N-E-W 表为每一行选择所有外行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54875420/