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表中的一列。如果这是一个变量,则需要在其前面加上@@abhiInnerCorserRequests
是子查询列的别名。它在外部查询中会立即重命名为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