【问题标题】:SQL Server 2008. Take info from two tables and concatenate row values. [duplicate]SQL Server 2008。从两个表中获取信息并连接行值。 [复制]
【发布时间】:2019-03-14 17:54:06
【问题描述】:

我查看了标记为重复的内容,但事实并非如此。我从两张桌子上拉出来,而不是一张。

首先,请允许我说我与这个数据库的设计无关。

我有两个必须连接的表,然后是未知数量的行,其中的数据必须连接成一个巨大的字符串。它们由记录 ID 连接。

项目表:

Item         RecordID
---------------------
Car A        123
Car B        456
Car C        789

是的,这句话从字面上切到了中间。值之间应该没有添加任何内容,并且我还需要保留逗号和其他特殊字符。

详情表:

RecordID     Details
--------------------------------
123          black pain
123          t, radials
123          , green le
123          ather, spo
123          rt steerin
123          g wheel, b
123          uilt-in GP
123          S
456          standard
789          black leat
789          her, teles
789          coping ste
789          ering whee
789          l, seven c
789         up holders
789         , heavy du
789         ty mudflap
789         s

我想要的结果是这样的:

ItemID       RecordID     Details
----------------------------------------------------------------------------
Car A        123          black paint, radials, green leather, sport steering wheel, built-in GPS
Car B        456          standard       
Car C        789          black leather, telescoping steering wheel, seven cup holders, heavy duty mudflaps

我查看了所有的 XML 文件,但不知道该怎么做。

提前致谢。

【问题讨论】:

  • 如果您没有其他列,那么您就有问题了。 SQL 数据本质上是“无序的”,如果没有另一列来排序,就无法知道连接记录的顺序。
  • 为了完整性,以防有人在这里找到他们的方式:在 SQL Server 2017 中有 STRING_AGG

标签: sql tsql sql-server-2008 string-aggregation


【解决方案1】:

无法保证您的 STUFF/FOR XML PATH 将产生您要求的结果,除非您的详细信息表中有一个 IDENTITY 字段或您可以排序的其他值将强制详细信息文本的顺序。

通常你可以使用带有 ORDER BY 语句的 STUFF 命令

SELECT
  Item.Item AS ItemID,
  Item.RecordID,
  STUFF( (
           SELECT
             '' + Details
           FROM
             Details
           WHERE
             Details.RecordID = Item.RecordID
             -- ORDER BY SomeLineIndicator
           FOR XML PATH ('')
         ), 1, 0, '' ) AS Details
FROM
  Item

我在没有 ORDER BY 的情况下在我的盒子上尝试了这个,碰巧得到了您要求的结果,但是如果没有可以用来强制订购的字段,您真的不能依赖这些结果。

请阅读这篇文章和链接的文章,了解更多关于为什么你需要一个字段以及为什么你不能依赖一个未确定的内部“索引”来为你处理它的信息:Default row order in SELECT query - SQL Server 2008 vs SQL 2012

【讨论】:

  • 有一个字段我可以订购它们。谢谢你,谢谢你,谢谢你。我诅咒创建第二张桌子的人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多