mysql - 递归连接sql中的列

标签 mysql sql sql-server concatenation recursive-query

我有一个包含如下值的表

╔═══╦════╦════╦══════╦══════╗
║ b ║ l1 ║ l2 ║  l3  ║  l4  ║
╠═══╬════╬════╬══════╬══════╣
║ a ║ b1 ║ c1 ║  d1  ║  e1  ║
║ d ║ x1 ║ y1 ║ null ║ null ║
╚═══╩════╩════╩══════╩══════╝

输出应该是:

╔═══════════╗
║ ab1c1d1e1 ║
║ ab1c1d1   ║
║ ab1c1     ║
║ ab1       ║
║ dx1y1     ║
║ dx1       ║
╚═══════════╝

这可能吗?我在这里看到一个模式,但能够弄清楚如何去做。 P.S: ROLLUP 无法使用,服务器不支持。

最佳答案

使用UNION ALL:

SELECT * FROM(
    SELECT  b + l1 + l2 + l3 + l4 FROM tbl UNION ALL
    SELECT  b + l1 + l2 + l3 FROM tbl UNION ALL
    SELECT  b + l1 + l2 FROM tbl UNION ALL
    SELECT  b + l1 FROM tbl
) AS t(a)
WHERE a IS NOT NULL

执行计划:

enter image description here


这是UNPIVOT的另一种方法,它只会扫描表一次:

SELECT x.a
FROM tbl t
CROSS APPLY(VALUES
    (b + l1 + l2 + l3 + l4),
    (b + l1 + l2 + l3),
    (b + l1 + l2),
    (b + l1)
) AS x(a)
WHERE a IS NOT NULL

执行计划:

enter image description here

关于mysql - 递归连接sql中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33165600/

相关文章:

c# - 如何将带有 Unions 的 SQL 查询转换为 LINQ?

sql - 基于Order By SQL消除重复

sql - T-SQL - 按周旋转

sql-server - 无法从Access导入数据到MS SQL Server

php - Mysql Innodb 不返回 select with desc order 的最后一行

MySQL 查询值不会传递到 ejs 文件。查询取决于先前查询的结果

mysql - 如何最终在 MySQL 上正确设置 utf8mb4?

sql - Oracle SELECT 前 10 条记录

c# - 无法删除数据库,因为它当前正在使用中

php - 使用php脚本将mysql数据库从一台服务器传输到另一台服务器,一次传输几条记录