Sql 子查询结果采用逗号分隔格式

Sql 子查询结果采用逗号分隔格式,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试编写一个子查询,它将所有结果存储在一个由逗号分隔的列中。我的代码看起来像这样 SELECT column1, column2, CourseRequests=(SELECT INNERCourseRequests = COALESCE(CASE WHEN innercourserequests

我正在尝试编写一个子查询,它将所有结果存储在一个由逗号分隔的列中。我的代码看起来像这样

SELECT column1, 
       column2, 
       CourseRequests=(SELECT INNERCourseRequests = 
                              COALESCE(CASE 
                                         WHEN innercourserequests 
                                              = '' THEN 
                                         crse_name 
                                         ELSE innercourserequests 
                                              + ',' + 
                                              crse_name 
                                       END, '') 
                       FROM   tor_studentcrserequest SCR 
                       WHERE  SCR.stud_pk = MS.tt_stud_pk 
                              AND SCR.delt_flag = 0), 
       column4 
FROM   tbl_mainstudent MS   
当我尝试执行存储过程时,会出现一个错误,显示
无效的列名'INNERCourseRequests'。

正确的方法是什么? TSR是外部列中对表的引用

编辑:我将其更改为:

 CourseRequests=(SELECT INNERCourseRequests = 
 COALESCE(case when @INNERCourseRequests='' THEN CRSE_NAME ELSE
@INNERCourseRequests+','+CRSE_NAME end,'')

然而,现在我得到一个错误,说
子查询返回了一个以上的结果,这是预期的。

我很确定你不能用一个查询来实现这一点,我也不完全确定我所使用的策略 这是一个合法的策略——也就是说,如果它没有文档化,SQL的未来版本可能会出现 不支持这一点。尽管如此:

从以下内容开始:

DECLARE @List varchar(max)

SELECT @List = isnull(@List + ', ', '') + InnerCourseRequests
 from tor_studentcrserequest
 where stud_pk = <TestValue>
  and delt_flag = 0

PRINT @List
(为delt_标志添加第二个参数,如果该参数可能有所不同)

并将其添加到查询中:

SELECT distinct tt_stud_pk, dbo.phkTest(stud_pk)
 from tbl_mainstudent
(我使用我的一个表编写了所有这些,然后剪切并粘贴了表/列,因此可能需要处理一些语法问题。)


可能有一些方法可以提高大型表的性能(
OUTER APPLY
、在调用函数之前选择distinct等等),而且很可能最好通过过程代码来完成,无论什么人首先查询数据。

您可以使用XML,并进行一些替换,如下所示:

SELECT column1, 
       column2, 
       CourseRequests=COALESCE(
                        REPLACE(REPLACE(REPLACE((
                       SELECT crse_name 
                       FROM   (
                                         SELECT 1, 22,  'first',  0
                               UNION ALL SELECT 2, 22,  'second', 1
                               UNION ALL SELECT 3, 22,  'third',  0
                               UNION ALL SELECT 4, 555, 'first',  1
                       ) SCR (id, stud_pk, crse_name, delt_flag)
                       WHERE  SCR.stud_pk = MS.tt_stud_pk 
                       AND SCR.delt_flag = 0
                       FOR XML PATH('')
                       ),'</crse_name><crse_name>', ','),
                     '</crse_name>', ''), -- remove end tag
                     '<crse_name>', ''), -- remove beginning tag
                      ''), -- optional COALESCE to ensure no NULLs
       column4 
FROM   (
                   SELECT  1, 'a', 'b', '2014-01-01'
         UNION ALL SELECT 22, 'd', 'e', '2014-02-02'
       ) MS (tt_stud_pk, column1, column2, column4)
说明:
FOR XML路径(“”)将子查询的结果展平为:
firstthird

  • 第一个替换仅转换仅在值之间找到的结束标记/开始标记组合(即逗号的位置)
  • 第二次替换将删除结束标记(不能在第一次替换之前完成)
  • 第三次替换将删除开始标记(不能在第一次替换之前完成)
  • 注意:

    可能有一种更优雅的方法来处理XML内容,这样您就不需要所有的替换,但不确定这是否有效。

    提供一些关于表结构的详细信息。为什么要将值分配给子选择中的InnerCorserRequests?它不应该只分配给CourseRequests吗?@wumpz我只是不确定如何做,我只是不知道在
    CourseRequests
    中,我怀疑innercourserequests不是tor\u StudentCrserRequests表中的一列。如果这是一个变量,则需要在其前面加上@@abhi
    InnerCorserRequests
    是子查询列的别名。它在外部查询中会立即重命名为CourseRequests。
    SELECT column1, 
           column2, 
           CourseRequests=COALESCE(
                            REPLACE(REPLACE(REPLACE((
                           SELECT crse_name 
                           FROM   (
                                             SELECT 1, 22,  'first',  0
                                   UNION ALL SELECT 2, 22,  'second', 1
                                   UNION ALL SELECT 3, 22,  'third',  0
                                   UNION ALL SELECT 4, 555, 'first',  1
                           ) SCR (id, stud_pk, crse_name, delt_flag)
                           WHERE  SCR.stud_pk = MS.tt_stud_pk 
                           AND SCR.delt_flag = 0
                           FOR XML PATH('')
                           ),'</crse_name><crse_name>', ','),
                         '</crse_name>', ''), -- remove end tag
                         '<crse_name>', ''), -- remove beginning tag
                          ''), -- optional COALESCE to ensure no NULLs
           column4 
    FROM   (
                       SELECT  1, 'a', 'b', '2014-01-01'
             UNION ALL SELECT 22, 'd', 'e', '2014-02-02'
           ) MS (tt_stud_pk, column1, column2, column4)
    
    column1 column2 CourseRequests  column4  
    a       b                       2014-01-01  
    d       e       first,third     2014-02-02