如何通过SQL查询合并XML输出数据?请求技术支持
解决SQL生成XML时合并同一病例的AnesthesiaStaff节点问题
我来帮你搞定这个XML合并的问题!你现在遇到的核心问题是查询逻辑导致每个医护人员记录单独生成了<AnesthesiaRecord>节点,而不是把同一病例下的所有医护人员合并到同一个<AnesthesiaStaffSet>中。
问题根源分析
你的原SQL直接关联了provcode_t,并且在GROUP BY里包含了d.provcode——这就意味着每个医护人员的记录都会作为独立的行输出,进而生成独立的<AnesthesiaRecord>节点。同时内部子查询的FOR XML PATH ('AnesthesiaStaffSet')会为每条医护记录单独生成一个<AnesthesiaStaffSet>,自然没法合并。
修改后的SQL解决方案
我们需要调整查询结构,先按患者+病例(也就是acctno + dateofservice)维度聚合,再通过子查询一次性获取该病例下的所有医护人员记录,从而合并到同一个<AnesthesiaStaffSet>中:
SELECT p.acctno AS [Demographic/PatientID], p.patdob AS [Demographic/DOB], c.poscode AS [Procedure/Facility], ( SELECT CAST(c.acctno AS VARCHAR(10)) + CONVERT(VARCHAR(10), c.dateofservice, 112) AS [AnesthesiaRecordID], ( -- 子查询获取当前病例下的所有医护人员,生成合并的AnesthesiaStaff节点 SELECT d.provcode AS [AnesthesiaStaff/ProvCode] FROM provcode_t d INNER JOIN charge_t c2 ON d.provcode = c2.provcode WHERE c2.acctno = p.acctno AND c2.dateofservice = c.dateofservice FOR XML PATH(''), TYPE -- PATH为空时,直接拼接多个AnesthesiaStaff节点 ) AS [AnesthesiaStaffSet] FOR XML PATH('AnethesiaCase'), TYPE ) FROM patdemo_t p INNER JOIN charge_t c ON p.acctno = c.acctno WHERE p.acctno IN (12345, 54321) AND c.dateofservice IN ('2018-02-15','2018-02-01') GROUP BY p.acctno, p.patdob, c.poscode, c.acctno, c.dateofservice -- 按患者+病例分组,确保每个病例只生成一个AnesthesiaRecord FOR XML PATH('AnesthesiaRecord'), ROOT('AnesthesiaRecords'), TYPE
关键调整点说明
- 分组维度优化:去掉
GROUP BY中的d.provcode,只按患者ID、病例日期等核心维度分组,确保每个患者的每个病例只生成一个<AnesthesiaRecord>节点。 - 医护人员子查询:通过内部子查询关联
charge_t和provcode_t,一次性获取当前病例下的所有医护人员,用FOR XML PATH('')直接生成多个<AnesthesiaStaff>节点(不需要额外父节点),再将这些节点包裹到<AnesthesiaStaffSet>中。 - 避免重复关联:主查询不再直接关联
provcode_t,而是放到子查询中,避免因多对多关联导致的行拆分。
预期输出验证
执行修改后的SQL后,会生成你期望的XML结构:同一患者同一病例的所有<AnesthesiaStaff>都会合并到同一个<AnesthesiaStaffSet>下,每个病例只对应一个<AnesthesiaRecord>节点。
内容的提问来源于stack exchange,提问作者A.Durant
相关产品推荐
相关产品推荐

