在sql中递归连接列

时间:2015-10-16 08:17:16

标签: 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无法使用,因为服务器不支持它。

2 个答案:

答案 0 :(得分:6)

使用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

答案 1 :(得分:0)

编辑:此增强型解决方案以裸字符串形式提供数据。如果这很快 - 我不知道。请让我知道......

 self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];