【问题标题】:Select Statement pulls values from a junction table into 1 comma delimited stringSelect 语句将连接表中的值提取到 1 个逗号分隔的字符串中
【发布时间】:2016-11-20 18:57:35
【问题描述】:

我有以下查询,从我的 Junction 表和 Category 表中选择“CategoryName”。

SELECT CategoryName 
FROM BND_ListingJunction_testing j
JOIN BND_ListingCategories c ON c.CatID = j.Junc_CatID
WHERE j.Junc_LID = 3

在 SQL 中,这可以正常工作,并为我的联结表中 LID 匹配的任何类别显示 X 行。

然而,我的 Web 应用程序在创建令牌时只读取第一个结果。是否可以提取 X 行的结果集并将它们全部显示在 1 行中,以逗号分隔。

例如:如果 LID=1 是类别的 5 次,则上述查询将为我的联结表中存在的每个类别返回 5 行。

我想要一个看起来像这样的结果集(在一列中):

 Category1, Category2, Category3, Category4, Category5

代替:

1   Category1
2   Category2
3   Category3
4   Category4
5   Category5

我再次以 5 为例,一条记录可以有 1-X 个类别。

---更新

我尝试了以下似乎可行但没有在结果之间添加 , 开头的方法。

Declare @Cats as Nvarchar(max) = ','
Select @Cats = @Cats + CategoryName
From BND_ListingJunction_testing j
JOIN BND_ListingCategories c on c.CatID = j.Junc_CatID
Where j.Junc_LID = 3

Print(@Cats)

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

对于 SQL Server,您可以使用 XML PATH 语句将多行转换为串行字符串聚合。

Postgres 有一个更易于使用的“string_agg()”聚合函数。

【讨论】:

  • 如果我在查询末尾添加FOR XML Path,如何删除 & & & 标签以便显示值?
  • 您尚未显示任何 Web 应用程序代码,因此您的问题无法真正解决。事实上,这听起来与关于连接行的问题完全不同。
  • 我的 Web 应用程序只是给了我一个插入 SQL 查询的区域。使用 SQL Management Studio 时,如果我添加 FOR XML Path,它会将所有行合并为一个,但会添加 XML 格式,我只需要逗号分隔字符串中的值。
  • 您需要的不仅仅是“FOR XML PATH”来生成逗号分隔的字符串。通过网络搜索可以找到许多示例。这是一个:sqlandme.com/2011/04/27/…
  • 感谢您的输入,在我的情况下,该链接同时具有类别和子类别,我只需要子类别尝试根据我的需要修改它们的示例。谢谢
【解决方案2】:

这达到了我想要的结果。

SELECT CategoryName + ', ' AS [text()] 
FROM BND_ListingJunction_testing j
JOIN BND_ListingCategories c on c.CatID = j.Junc_CatID
WHERE Junc_LID=2
FOR XML PATH ('')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2017-09-29
    相关资源
    最近更新 更多