Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sql命令,用于展平具有多对多关系的2个表_Sql Server - Fatal编程技术网

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

您提供的查询无法运行,它没有来自的
。您是对的。修好它