首页 > 解决方案 > 是否有一种智能的动态方法可以将拆分为多行的文本合并在一起?

问题描述

我有一个这样的表结构:

第一张桌子

ID   | Text
----------------------
342  | Sampl    <--
342  | e Text.. <-- 
343  | Lorem ipsum
344  | Pellentesque habitant

第二张桌子

ID   | lineNumb 
----------------------
342  | 1
342  | 2
343  | 1
344  | 1

文本被多行分割。ID 将它们标识为一个数据集。任何数据集的行号都是不同的。

有没有一种聪明的方法首先获得最大的行号,然后将文本合并在一起而不用每个行号左连接?

这是可行的方法,但它不是硬编码 40 个左连接的聪明方法:

 SELECT *
FROM
  (SELECT id,
          COALESCE(Rtrim(Cast(z1.dfw350_text AS VARCHAR(MAX))), '') + Char(13) + Char(10) + COALESCE(Rtrim(Cast(z2.dfw350_text AS VARCHAR(MAX))), '') + Char(13) + Char(10) + COALESCE(Rtrim(Cast(z3.dfw350_text AS VARCHAR(MAX))), '') + Char(13) + Char(10) + COALESCE(Rtrim(Cast(z4.dfw350_text AS VARCHAR(MAX))), '') + Char(13) + Char(10) + COALESCE(Rtrim(Cast(z5.dfw350_text AS VARCHAR(MAX))), '') + Char(13) + Char(10) + COALESCE(Rtrim(Cast(z6.dfw350_text AS VARCHAR(MAX))), '') + Char(13) + Char(10) + COALESCE(Rtrim(Cast(z7.dfw350_text AS VARCHAR(MAX))), '') .... AS texte
   FROM table1
   LEFT JOIN
     (SELECT *
      FROM table1
      WHERE linenumb = 2 ) z2 ON table1.id = z2.id
   LEFT JOIN
     (SELECT *
      FROM table1
      WHERE linenumb = 3 ) z3 ON table1.id = z3.id
   LEFT JOIN
     (SELECT *
      FROM table1
      WHERE linenumb = 4 ) z4 ON table1.id = z4.id) AS ka
INNER JOIN (
SELECT id,
       linenumb
FROM table2
GROUP BY id,
         linenumb x ON ka.id=x.id

预期的输出是这样的查询:

ID   | Text
----------------------
342  | Sample Text..
343  | Lorem ipsum
344  | Pellentesque habitant

标签: sqldatabasetsql

解决方案


假设你的表实际上有第三列提供排序,你可以做一个简单的聚合查询:

ID   | Position | Text
-----|----------|-----------------------
342  | 1        | Sampl
342  | 2        | e Text...
343  | 1        | Lorem ipsum
344  | 1        | Pellentesque habitant

SELECT
    ID,
    STRING_AGG (Text, '') WITHIN GROUP (ORDER BY Position) Text_Concat
FROM table1
GROUP BY
    ID;

演示的屏幕截图

演示


推荐阅读