sql - 使用 N-E-W 表为每一行选择所有外行

标签 sql sql-server string tsql join

我有一个 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  |
+---------------+-----------------------+

我现在正在做的是:

  1. SELECT * FROM Teachers;

  2. 将结果保存在数组中。

  3. 在每个循环中迭代执行此查询的数组:

    SELECT Name 
    FROM Subjects inner join "everything" 
    WHERE TeacherTeachesSubject.TeacherId = actualteacherid;
    
  4. 将结果保存为字符串,以逗号分隔。

每次我想从表中选择所有数据时,我都会进行 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/

相关文章:

c# - 我的数据没有保存在我的数据库中 - C# visual studio

PHP - 在数组中显示 $ 语句

java - 为什么这不起作用? java

sql - 在 NUMBER 列的 IN 子句中使用逗号分隔值

sql-server - SQL Server 的 SchemaSpy 使用夜间构建

sql - Rails HABTM 查询——带有所有标签的文章

javascript - 使用 Knex.js 的 select 语句的子查询

c++ - 将 double 转换为字符串,保持数字的高精度,C++

sql - 选择超过总值百分比的行子集

c# - DataGridview 重复数据或不将新行保存到数据库