sql - 是否有一种智能的动态方法可以将拆分为多行的文本合并在一起?
问题描述
我有一个这样的表结构:
第一张桌子
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
解决方案
假设你的表实际上有第三列提供排序,你可以做一个简单的聚合查询:
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;
演示
推荐阅读
- python-2.7 - SSLError:[Errno 1] _ssl.c:510:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
- create-react-app - 公共 JS 文件中的 yarn build + create-react-app + env 变量
- javascript - 如何捕获浏览器控制台中显示的异常?
- spring-boot - Spring boot + apache CXF Soap 客户端
- hyperledger - 通过概念查询一组参与者
- c# - 如何在 C# 中使用多个 IF 条件
- scala.js - 如何在 scala.js 中访问 node.js process.env.ENV_VARIABLE?
- javascript - 如何根据特定用户输入在 JavaScript 中显示警报
- mysql - MySQL 是否支持数据结构(例如 AVL 树或堆)?
- windows - 安装 Xdebug 以在 VS Code 1.2.1 中使用