当前位置: 首页 > 面试题库 >

简化CTE字符串串联?

江高飞
2023-03-14
问题内容

我有以下代码清单

Code Meaning 
1    Single 
2    Married/Separate 
3    Divorced 
4    Widowed 
8    Not Applicable 
99   Not known

我正在尝试使用CTE将它们展平为一行。我有一个使用RowNumber函数执行此操作的CTE解决方案。

WITH Flattened (JoinItem, CodeMeaning) AS
(
    SELECT 1 AS JoinItem, CAST('' AS VARCHAR(255))
    UNION ALL
    SELECT f.JoinItem+1, CAST(f.CodeMeaning + ',' + c.CodeMeaning AS VARCHAR(255))
    FROM
    (
        SELECT JoinItem = ROW_NUMBER() OVER (ORDER BY Code),c.Code + ' - ' + c.Meaning AS CodeMeaning
        FROM Codes c
    ) c
    INNER JOIN Flattened f
    ON f.JoinItem=c.JoinItem
)
SELECT TOP 1 JoinItem,  CodeMeaning 
FROM Flattened 
ORDER BY JoinItem DESC

但是,我想知道是否可以不使用RowNumber函数而仍然使用CTE来做到这一点。所以我有以下内容-我认为更简单的内容-SQL

WITH Flattened (JoinItem, CodeMeaning) AS
(
    SELECT 1 AS JoinItem, CAST('' AS VARCHAR(255))
    UNION ALL
    SELECT c.JoinItem, CAST(f.CodeMeaning + ',' + c.CodeMeaning AS VARCHAR(255))
    FROM
    (
        SELECT 1 AS JoinItem,c.Code + ' - ' + c.Meaning AS CodeMeaning
        FROM Codes c            
    ) c
    INNER JOIN Flattened f
    ON f.JoinItem=c.JoinItem
)
SELECT JoinItem, odeMeaning 
FROM Flattened

现在,它可以最大限度地利用递归并生成类似笛卡尔联接的东西-如果还不算更糟的话!

我希望尝试使用固定的“ JoinItem”每次将其加入锚记录

因此,如果有解决方案,任何指向我要去哪里的指示都将有所帮助。


问题答案:

假设这是SQL Server,您是否考虑过以下内容:

select stuff((select ',' + c.code + '-' + c.Meaning
              from codes c
              order by code
              for xml path ('')
             ), 1, 1, '')

编辑:

要使用CTE进行此操作, 请先 定义顺序号,然后进行展平:

with c as (
      select row_number() over (order by code) as seqnum, c.code + '-' + c.meaning as CodeMeaning
      from codes c
     ),
     flattened as (
      select CodeMeaning as CodeMeaning
      from c
      where rownum = 1
      union all
      select f.CodeMeaning + ',' + c.CodeMeaning
      from c join
           flattened f
           on c.seqnum = f.seqnum + 1
     )
select *
from flattened;

如果列表太长,则可能必须增加默认递归级别。



 类似资料:
  • 问题内容: 我看到许多人使用这样的格式字符串: 而不是像这样简单地串联字符串: 格式字符串是否具有更好的性能,还是仅用于外观? 问题答案: 这只是为了外观。您可以一眼看出格式是什么。我们中的许多人都比微优化更喜欢可读性。 让我们看看IPython的意思:

  • 每个 Mvc 框架都有自己的本地化字符串的解决方案, Nutz.Mvc 的这个是相当简陋的。 我只是个人觉得足够用了。下面我把它简单介绍一下: 假定所有的本地化字符串文件都会存放在某一目录下 这个目录下所有的 .properties 文件,将作为默认的本地字符串文件。 每一种语言都会是一个目录,目录名称对应一个 Locale 的 toString(),请参看 java.util.Locale 的

  • Sds (Simple Dynamic String,简单动态字符串)是 Redis 底层所使用的字符串表示, 几乎所有的 Redis 模块中都用了 sds。 本章将对 sds 的实现、性能和功能等方面进行介绍, 并说明 Redis 使用 sds 而不是传统 C 字符串的原因。 sds 的用途 Sds 在 Redis 中的主要作用有以下两个: 实现字符串对象(StringObject); 在 Re

  • 问题内容: 我正在从事Java代码优化。我不清楚或符号之间的区别: 第2行和第3行有什么区别? 问题答案: 这种方法使用StringBuilder创建结果字符串 此方法仅调用的静态方法来获取int的String版本 依次调用

  • 问题内容: 以下语句, 产生输出。 但是,以下内容 产生。 区别在哪里? 问题答案: 您会因为操作符优先级和字符串转换的结合而看到此行为。 JLS 15.18.1 指出: 如果只有一个操作数表达式的类型为String,则对另一操作数执行字符串转换(第5.1.11节),以在运行时生成字符串。 因此,第一个表达式中的右侧操作数将隐式转换为字符串: 但是对于第二个表达式,必须将复合赋值运算符与一起考虑。

  • 本文向大家介绍通过+(字符串串联)运算符进行字符串串联。,包括了通过+(字符串串联)运算符进行字符串串联。的使用技巧和注意事项,需要的朋友参考一下 您可以使用Java的“ +”运算符来连接字符串。 示例 输出结果