Объединение таблиц в SQL в одну строку - PullRequest
0 голосов
/ 27 мая 2020

У меня есть следующая структура таблицы моей базы данных:

структура базы данных

Моя цель - вывести каждую строку tbl_Therapeuten (это мои сотрудники) с название их тренировок (по-немецки Fortbildung). Названия тренингов хранятся в tbl_Forbildungen. А тренинги, которые проходят у каждого сотрудника, хранятся в tbl_Therapeut_Fortbildung. Для вывода я хочу показать название тренировки, а не идентификатор. Как это:

вывод

Я программирую на C#, SQL сервере. Сначала я попробовал это:

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 ";

Но это вызывает ошибку, в которой говорится, что я не использую tbl_Therapeuten.Id в агрегатной функции или в предложении Group by.

Затем я попробовал это :

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";

Это сработало (кроме отображения имени тренировки, но идентификатора), но я не хочу явно называть каждый столбец tbl_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.

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вы можете обнаружить, что коррелированный подзапрос обеспечивает лучшую производительность (за счет исключения внешней агрегации) и позволяет избежать перечисления всех столбцов из 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 
1 голос
/ 27 мая 2020

Думаю, это то, что вам нужно.

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

Насколько я знаю, сервер SQL не поддерживает GROUP BY *, поэтому вам придется указать имена столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...