将sql中的表连接到一行中

8dtrkrch  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(423)

我的数据库的表结构如下:
数据库结构
我的目标是输出每一行tblèu therapeuten(他们是我的员工)和他们的培训名称(德语“fortbildung”)。培训的名称存储在tbl\ U中,以供学习。每个员工所接受的培训都储存在tbl\ U therapeut\ U进行培养。对于输出,我要显示培训的名称,而不是id。如下所示:
输出
我正在用c#,sql server编程。首先我试了一下:

string sSQL = "SELECT t.*, STRING_AGG(tf.Id_Fortbildung, ';') AS Fortbildungen " +
              "FROM tbl_Therapeuten t " +
              "FULL OUTER JOIN tbl_Therapeut_Fortbildung tf on t.Id = tf.Id_Therapeut ";

但这会带来一个错误,其中包含我没有在聚合函数或GROUPBY子句中使用tbl\u therapeuten.id。
接下来我尝试了这个:

string sSQL = "SELECT t.Id, t.Nachname, STRING_AGG(tf.Id_Fortbildung, ';') AS Fortbildungen " +
              "FROM tbl_Therapeuten t " +
              "FULL OUTER JOIN tbl_Therapeut_Fortbildung tf on t.Id = tf.Id_Therapeut " +
              "GROUP BY t.Id, t.Nachname";

这是有效的(除了显示训练的名称,但是显示id),但是我不想显式地命名tbl\u therapeuten的每一列。我想用“t*”。但这是行不通的:

string sSQL = "SELECT t.*, STRING_AGG(tf.Id_Fortbildung, ';') AS Fortbildungen " +
              "FROM tbl_Therapeuten t " +
              "FULL OUTER JOIN tbl_Therapeut_Fortbildung tf on t.Id = tf.Id_Therapeut " +
              "GROUP BY t.*";

所以我需要一些帮助:)
我也不知道如何显示培训的名称而不是id。
谢谢你的帮助!

js4nwp54

js4nwp541#

您可能会发现相关子查询提供了更好的性能(通过避免外部聚合),并允许您避免列出所有列 t :

SELECT T.*,
       (SELECT STRING_AGG(F.Name, ';')
        FROM tbl_Therapeut_FortBildung TF JOIN
             tbl_FortBildungen F 
             ON F.Id = TF.Id_FortBildung
        WHERE TF.Id_Therapeut = T.Id
       ) as Fortbildungen
FROM Therapeuten T
ykejflvf

ykejflvf2#

我想这就是你需要的。

SELECT T.Id,T.Name,T.Street,T.BirthDate,STRING_AGG(F.Name,';')
FROM Therapeuten T 
LEFT JOIN tbl_Therapeut_FortBildung TF ON TF.Id_Therapeut=T.Id
LEFT JOIN tbl_FortBildungen F ON F.Id=TF.Id_FortBildung
GROUP BY T.Id,T.Name,T.Street,T.BirthDate

据我所知,SQLServer不支持GROUPBY*,因此必须指定列名。

相关问题