首页 > 解决方案 > STUFF 和 XML PATH 的问题 - 研究了很多但没有运气

问题描述

我在这里查找了许多关于 XML PATH 和 STUFF 的问题和答案,但我无法让它适用于我的查询。我知道这是用户错误,但我无法弄清楚。任何帮助表示赞赏。

这是我的示例查询:

SELECT DISTINCT 
     map.Name
    ,loc.MainAddress
    ,loc.MainCity
    ,loc.MainStateProvince_MisStateProvID
    ,loc.MainZipPostal
FROM                meditech_livefdb.dbo.MisLoc_Main             loc
    LEFT OUTER JOIN meditech_livefdb.dbo.MisNomenclatureMap_Main map ON (loc.SourceID = map.SourceID AND loc.NomenclatureMap = map.MisNomenclatureMapID)
WHERE loc.MainAddress = '123 Main Street'

map.Name列出在每个地址位置提供的服务。大多数地点都提供多种服务。我想要一个不同的地址位置列表,其中包含一个显示该位置提供的所有服务的组合字段。我已经尝试了以下方法,但它根本不起作用。

SELECT DISTINCT 
     loc.MainAddress
    ,loc.MainCity
    ,loc.MainStateProvince_MisStateProvID
    ,loc.MainZipPostal
    ,STUFF((SELECT ', ' + map.Name FOR XML PATH('')), 1, 1, '') AS Services
FROM                meditech_livefdb.dbo.MisLoc_Main             loc
    LEFT OUTER JOIN meditech_livefdb.dbo.MisNomenclatureMap_Main map ON (loc.SourceID = map.SourceID AND loc.NomenclatureMap = map.MisNomenclatureMapID)
WHERE loc.MainAddress = '123 Main Street'

这只是给了我与第一个查询相同的信息。看看我做错了什么?谢谢。

标签: sqlsql-server

解决方案


尝试在您的 stuff 子句中单独引用映射表(将 map.ID 替换为您调用的唯一 id 字段):

STUFF((SELECT ',' + map2.Name
        FROM meditech_livefdb.dbo.MisNomenclatureMap_Main map2
        WHERE map.ID = map2.ID FOR XML PATH('')
    ), 1, 1, '') AS Services

推荐阅读