Команда sql, чтобы сгладить 2 таблицы со многими ко многим - PullRequest
0 голосов
/ 20 октября 2019

У меня есть 2 таблицы со многими ко многим. Рассмотрим приведенный ниже вариант использования

Пациенты

id | Name
---+------------------
1    jack
2    sara
3    patrick

Болезни

id | Disease
---+-----------------
1    Diabetes
2    Cancer
3    Epilepsy

У каждого пациента может быть несколько заболеваний. Таблица соединений:

PatientDisease

Patient_id | Disease_id
-----------+--------------
1                1
1                3
2                2

Я хочу перечислить болезни для каждого пациента.

Попытки

Приведенный ниже запрос создает полукорректный результат для пациента с одним или несколькими заболеваниями:

SELECT 
    Patients.Name,  
    Diseases = STUFF((SELECT ',' + dbo.Diseases.Name 
                      FROM dbo.Diseases 
                      FOR  XML PATH(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM dbo.Patients
LEFT JOIN 
    dbo.PatientDiseases ON PatientDiseases.Patient_Id = Patients.Id
JOIN 
    dbo.Diseases ON Diseases.Id = PatientDiseases.Disease_Id

Как мне написать запрос, который выдает такой результат?

name    | diseases
--------+-------------------
jack    | diabetes, Epilepsy
sara    | cancer
patrick | NULL 

1 Ответ

0 голосов
/ 20 октября 2019

Похоже, что вы должны делать, это:

SELECT P.[Name],
       STUFF((SELECT ',' + D.Disease
              FROM dbo.PatientDisease PD
                   JOIN dbo.Diseases D ON PD.Disease_id = D.id
              WHERE PD.Patient_id = P.id
              FOR XML PATH(''),TYPE).value('.','nvarchar(MAX)'),1,1,'') AS Diseases
FROM dbo.Patients P;

Если вы используете SQL Server 2017, вы можете использовать STRING_AGG:

SELECT P.[Name],
       STRING_AGG(D.Disease,',') WITHIN GROUP (ORDER BY D.Disease) AS Diseases
FROM dbo.Patients P
    LEFT JOIN dbo.PatientDisease PD ON P.id = PD.Patient_id
    LEFT JOIN dbo.Diseases D ON PD.Disease_id = D.id
GROUP BY P.[Name];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...