Mysql sql中的递归concat列

Mysql sql中的递归concat列,mysql,sql,sql-server,concatenation,recursive-query,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

我有一个包含如下值的表

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

╔═══════════╗
║ ab1c1d1e1 ║
║ ab1c1d1   ║
║ ab1c1     ║
║ ab1       ║
║ dx1y1     ║
║ dx1       ║
╚═══════════╝
可能吗?我在这里看到了一种模式,但我能找到它的方法。 注意:无法使用汇总,因为服务器不支持它。

使用UNION ALL:

执行计划:

以下是取消PIVOT的另一种方法,这将只扫描表一次:

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
执行计划:


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

DECLARE @tbl TABLE( b varchar(100),l1 varchar(100),l2 varchar(100),l3 varchar(100), l4 varchar(100));
INSERT INTO @tbl VALUES
 ('a','b1','c1','d1','e1')
,('d','x1','y1',null,null);


SELECT u.v.value('.','varchar(max)')
FROM
(
    SELECT   '' + b + l1 + l2 + l3 + l4 + ';' AS x
            ,'' + b + l1 + l2 + l3 + ';'      AS x
            ,'' + b + l1 + l2 + ';'           AS x
            ,'' + b + l1 + ';'                AS x
    FROM @tbl
    FOR XML PATH(''),TYPE
) AS XMLList(x)
CROSS APPLY XMLList.x.nodes('/x') AS a(b) 
CROSS APPLY(SELECT CAST('<r>' + REPLACE(a.b.value('.','varchar(max)'),';','</r><r>') + '</r>' AS XML)) AS m(n)
CROSS APPLY m.n.nodes('/r') AS u(v)
WHERE LEN(u.v.value('.','varchar(max)'))> 0

/* Result

ab1c1d1e1
ab1c1d1
ab1c1
ab1
dx1y1
dx1

*/

出于好奇,有没有一种方法不需要对要选择的列和行进行硬编码就可以做到这一点?顺便提一下,我用星号标出了这个问题。每次选择完成后,它都会扫描表格。因为后面是xml。这将是昂贵的。我需要在3到5毫秒内获得最大输出。@TimBiegeleisen,也许是动态SQL。@TejalKarande,我认为没有更快的方法。另一个解决方案是必须取消每一行的PIVOT,然后加入,我认为这将更加昂贵。我把它留给你测试。嗯,显示器本身需要时间。不过,我相信交叉应用将是最快的方法。如果我在表中插入xml,表创建本身需要时间,因此这不是一个选项。谢谢:@TejalKarande,你在我的答案中发现了一个增强的变体。结果不再是XML了,但是——老实说——我不希望这比Felix的答案快。我只是好奇这是否有效…嘿。。当我将其与交叉应用程序进行比较时,您的查询速度较慢。。谢谢:
DECLARE @tbl TABLE( b varchar(100),l1 varchar(100),l2 varchar(100),l3 varchar(100), l4 varchar(100));
INSERT INTO @tbl VALUES
 ('a','b1','c1','d1','e1')
,('d','x1','y1',null,null);


SELECT u.v.value('.','varchar(max)')
FROM
(
    SELECT   '' + b + l1 + l2 + l3 + l4 + ';' AS x
            ,'' + b + l1 + l2 + l3 + ';'      AS x
            ,'' + b + l1 + l2 + ';'           AS x
            ,'' + b + l1 + ';'                AS x
    FROM @tbl
    FOR XML PATH(''),TYPE
) AS XMLList(x)
CROSS APPLY XMLList.x.nodes('/x') AS a(b) 
CROSS APPLY(SELECT CAST('<r>' + REPLACE(a.b.value('.','varchar(max)'),';','</r><r>') + '</r>' AS XML)) AS m(n)
CROSS APPLY m.n.nodes('/r') AS u(v)
WHERE LEN(u.v.value('.','varchar(max)'))> 0

/* Result

ab1c1d1e1
ab1c1d1
ab1c1
ab1
dx1y1
dx1

*/