Sql server sql命令,用于展平具有多对多关系的2个表
我有两个具有多对多关系的表。考虑下面的用例 患者Sql server sql命令,用于展平具有多对多关系的2个表,sql-server,Sql Server,我有两个具有多对多关系的表。考虑下面的用例 患者 id | Name ---+------------------ 1 jack 2 sara 3 patrick id | Disease ---+----------------- 1 Diabetes 2 Cancer 3 Epilepsy 疾病 id | Name ---+------------------ 1 jack 2 sara 3 patrick id | Disease
id | Name
---+------------------
1 jack
2 sara
3 patrick
id | Disease
---+-----------------
1 Diabetes
2 Cancer
3 Epilepsy
疾病
id | Name
---+------------------
1 jack
2 sara
3 patrick
id | Disease
---+-----------------
1 Diabetes
2 Cancer
3 Epilepsy
每个患者都可能患有多种疾病。连接表为:
耐心等待
Patient_id | Disease_id
-----------+--------------
1 1
1 3
2 2
我想列出每个病人的疾病
尝试
id | Name
---+------------------
1 jack
2 sara
3 patrick
id | Disease
---+-----------------
1 Diabetes
2 Cancer
3 Epilepsy
以下查询为患有一种或多种疾病的患者创建半正确的结果:
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
看起来你应该做的是:
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\u 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];
您提供的查询无法运行,它没有来自的
。您是对的。修好它