【发布时间】:2019-01-10 18:59:54
【问题描述】:
目前我的结果集是由这个语句定义的
ISNULL('| ' + [Contry],'') + ISNULL('| ' + [State],'') + ISNULL('| ' + [City],'')
AS ProjectLocation
上面显示的“地点”字段的当前输出如下所示:
United States, United States, United States| California, Hawaii, Virginia| Norfolk, Pearl Harbor, San Diego,
我需要输出如下:
United States, Hawaii, Pearl Harbor | United States, Virginia, Norfolk | United States, California, San Diego
上面调用的列的值是基于FOR XML PATH('')函数定义的,如下:
WITH CTE AS
(
SELECT
(SELECT Country.CountryName + ', '
FROM MyDB.dbo.Country c
INNER JOIN MyDB.dbo.Contract con ON c.CountryID = con.ContryID
AND Opp.OppID = Con.OppID
FOR XML PATH('')) AS Country,
(SELECT State.StateName + ', '
FROM MyDB.dbo.State s
INNER JOIN MyDB.dbo.Contract con ON s.StateID = con.ContryID
AND Opp.OppID = Con.OppID
FOR XML PATH('')) AS State,
(SELECT State.StateAbbr + ', '
FROM MyDB.dbo.State s
INNER JOIN MyDB.dbo.Contract con ON s.StateID = con.ContryID
AND Opp.OppID = Con.OppID
FOR XML PATH('')) AS StateCode,
(SELECT Location.LocationName + ', '
FROM MyDB.dbo.Location l
INNER JOIN MyDB.dbo.Contract con ON l.LocationID= con.LocationID
AND Opp.OppID = Con.OppID
FOR XML PATH('')) AS City
FROM ''"
YourDB.dbo.Opportunity Opp
)
SELECT ...
FROM CTE
附言
“YourDB.dbo.Opportunity”表表示一个包含所有可供承包商使用的项目的表
“MyDB.dbo.Contract”表是一个查找表,用于将项目与雇用的承包商联系起来。
这就是为什么我需要调用 FOR XML 函数,因为 One Opportunity 可能有多个承包商位于不同的州和城市。
目前我使用第一个语句从 CTE 中进行选择,如下所示:
SELECT
ISNULL('| ' + [Contry],'') + ISNULL('| ' + [State],'') + ISNULL('| ' + [City],'')
AS ProjectLocation
FROM CTE
但正如我所说,它产生了不正确的输出。
【问题讨论】:
-
答案取决于您的表是如何相互关联的。它可能是一个
Addresses表,所有这些表都有 FK,或者您可能在这些表中有一个层次结构。因此,如果您想要一个有意义的答案,一些示例架构和数据会很有帮助。 -
嗨,罗杰,根据您的建议,我已为问题添加了更多上下文。希望对您有所帮助。
标签: sql-server string concatenation sql-server-2016 for-xml-path