Существует ли разумный динамический способ объединения текста, который разбивается на несколько строк? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть такая структура таблицы:

Первая таблица

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

Вторая таблица

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

Текст разделен на несколько строк. Идентификатор идентифицирует их как один набор данных. Номер строки любого набора данных варьируется.

Есть ли разумный способ сначала получить максимальный номер строки, а затем объединить текст, не соединяя по левому краю каждый номер строки?

Вот кое-что, что работаетно это нелегкий способ жестко закодировать 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

1 Ответ

3 голосов
/ 18 октября 2019

Предполагая, что в вашей таблице фактически есть третий столбец, в котором указано упорядочение, вы можете выполнить простой запрос агрегации:

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;

screen capture of demo

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...