【问题标题】:alternative to stuff function in sql server替代sql server中的东西功能
【发布时间】:2015-01-24 15:30:21
【问题描述】:

我有如下表 Tab1(我的实际表有多达 20,000 行

a     b      c    statecode
-------------------------------------------
A1   abc   def    FL          
B1   abc   def    AZ
C1   abc   def    MI
D1   abc   def    CO
E1   abc   def    IL
F1   abc   def    CA

这是我想要做的:对于给定的 b 和 c 列组合,如果存在多行,那么我想连接一个逗号分隔的“a - statecode”。

我需要如下结果...

a     b      c    statecode   output
-------------------------------------------
A1   abc   def      FL          A1-FL,B1-AZ,C1-MI,D1-CO,E1-IL,F1-CA

我尝试了什么: 我为此尝试了 sql stuff 函数

SELECT a, b,c,
  STUFF((SELECT  distinct ', '+ t1.a +'-'+ t1.statecode
             FROM Tab1 t1
             where  t2.b = t1.a
             and    t2.c= t1.c 
             FOR XML PATH('')), 1, 1,'') AS output
from Tab1 t2;

这适用于相对较小的表,我的实际表有 20,000 行和 15 列,我必须检查 10 列组合的相等性(如本例中的 b、c 还有 8 个)。

有没有更好的方法在 sql 中做到这一点?或者提高 stuff 函数的性能?

【问题讨论】:

  • 我遇到了同样的问题并寻找答案并到达这里。当我读到情况并非如此时,我尝试绕过我的查询,我所做的是将整个 XML Sub Select 左连接到主查询。

标签: sql sql-server group-by sql-server-2012


【解决方案1】:

这里的问题不是stuff() 函数。这是子查询和 XML 处理。

在 SQL Server 中确实没有替代方案。我的意思是,还有另外两种可能的方法来进行聚合字符串连接:编写您自己的 UDF,或者,如果您只有少数值,请使用 row_number() 和字符串连接。

在走这条路之前,请尝试优化您的查询。首先要做的是在tab1(a, c) 上创建一个索引。

注意:最好使用显式 XML 标记来编写。语法非常相似:

SELECT a, b,c,
  STUFF((SELECT  distinct ', '+ t1.a +'-'+ t1.statecode
             FROM Tab1 t1
             where  t2.b = t1.a and
                    t2.c= t1.c 
             FOR XML PATH('concat'), Type
         ).Value('/concat[1]', 'varchar(max)'), 1, 1,'') AS ACCEPTED_SYMBOLS
from Tab1 t2;

它的作用是在 XML 中创建字符串连接,然后将其从 XML 转换回字符串。这样做的好处是字符 &<> 不会转换为它们的 XML 等效项(例如 ∓)并保持您所期望的那样。

【讨论】:

  • .Value 应为小写:.value
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2023-03-07
  • 2014-11-16
  • 2019-07-08
  • 2016-06-22
  • 2012-07-21
相关资源
最近更新 更多