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

是否可以使用CTE将列值连接成字符串?

段干博明
2023-03-14
问题内容

说我有下表:

id|myId|Name
-------------
1 | 3  |Bob 
2 | 3  |Chet
3 | 3  |Dave
4 | 4  |Jim
5 | 4  |Jose
-------------

是否可以使用递归CTE生成以下输出:

3 | Bob, Chet, Date
4 | Jim, Jose

我已经试了一下,但是还没能使它正常工作。我会使用其他技术做得更好吗?


问题答案:

我不建议这样做,但是我设法解决了。

桌子:

CREATE TABLE [dbo].[names](
    [id] [int] NULL,
    [myId] [int] NULL,
    [name] [char](25) NULL
) ON [PRIMARY]

数据

INSERT INTO names values (1,3,'Bob')
INSERT INTO names values 2,3,'Chet')
INSERT INTO names values 3,3,'Dave')
INSERT INTO names values 4,4,'Jim')
INSERT INTO names values 5,4,'Jose')
INSERT INTO names values 6,5,'Nick')

询问:

WITH CTE (id, myId, Name, NameCount)
     AS (SELECT id,
                myId,
                Cast(Name AS VARCHAR(225)) Name,
                1                          NameCount
         FROM   (SELECT Row_number() OVER (PARTITION BY myId ORDER BY myId) AS id,
                        myId,
                        Name
                 FROM   names) e
         WHERE  id = 1
         UNION ALL
         SELECT e1.id,
                e1.myId,
                Cast(Rtrim(CTE.Name) + ',' + e1.Name AS VARCHAR(225)) AS Name,
                CTE.NameCount + 1                                     NameCount
         FROM   CTE
                INNER JOIN (SELECT Row_number() OVER (PARTITION BY myId ORDER BY myId) AS id,
                                   myId,
                                   Name
                            FROM   names) e1
                  ON e1.id = CTE.id + 1
                     AND e1.myId = CTE.myId)
SELECT myID,
       Name
FROM   (SELECT myID,
               Name,
               (Row_number() OVER (PARTITION BY myId ORDER BY namecount DESC)) AS id
        FROM   CTE) AS p
WHERE  id = 1

根据要求,这是XML方法:

SELECT myId,
       STUFF((SELECT ',' + rtrim(convert(char(50),Name))
        FROM   namestable b
        WHERE  a.myId = b.myId
        FOR XML PATH('')),1,1,'') Names
FROM   namestable a
GROUP BY myId


 类似资料:
  • 问题内容: 我有如下代码: 当我这样做时,Findbugs总是报告错误。 问题答案: 如果您要手动连接,我会使用, 但是,如果您要迭代和串联,我建议,

  • 是否可以使用通用sql将超过4000个字符的字符串插入CLOB 新增列: 我必须用SQL插入它 请指教。

  • 问题内容: 我在寻找什么: 设置一个字符的一半样式的方法。(在这种情况下,一半字母是透明的) 我目前正在搜索并尝试过的内容(没有运气): 样式字符/字母一半的方法 使用CSS或JavaScript设置字符的样式 将CSS应用于字符的50% 以下是我尝试获取的示例。 为此是否存在CSS或JavaScript解决方案,还是我不得不诉诸图像?我宁愿不走图片路线,因为此文本最终会动态生成。 更新: 既然许

  • 问题内容: 我已经解析了上面的JSON(使用.ajax和jsonp作为回调),并且我想将“ name”的所有值连接到字符串中。即“狗,猫,羊”。我怎样才能做到这一点?我已经尝试过对“类别”和名称进行简单连接,即 要么 但是因为我们正在查看它的成员及其字符串值,所以它不起作用。 问题答案: 这看起来像工作!

  • 我知道我不应该优化我的程序的每一个点,所以请考虑这个问题是“学术性的” 我最大有100个字符串和整数,每个都是这样的: 这个集合是预先初始化的,这意味着一旦创建,它就永远不会更改。在集合初始化之后,我会非常密集地使用它,所以快速查找很好。字符串很短,最多30个字符。映射的int也有限,介于1和100之间。 至少知道字符串是预初始化的,并且永远不会更改,应该可以“找到”导致“一篮子一项”映射的哈希函