我正在使用子查询来获取所需的结果(返回多个记录),我想将这些结果放在返回的单个记录中。
当我自己运行子查询时,它可以工作,但是一旦我将它用作子查询,它就会因语法错误而无法工作。
以下代码导致语法错误
('='附近的语法不正确。)
declare @test varchar(1000)
set @test = ''
SELECT description, (SELECT @test = @test + FirstName
FROM EMP_tblEmployee
)select @test
FROM EMP_tblCrew
基本上,子查询
(SELECT @test = @test + FirstName
FROM EMP_tblEmployee
)select @test
返回“charliejohnjacob”
主要查询
SELECT description FROM EMP_tblCrew
返回“janitor”
所以我想要它说
看门人| charliejohnjacob
2个字段,1个记录。
答案 0 :(得分:1)
您的查询在语法上并不正确,并且T-SQL解析器有一种令人不快的习惯,即有时不能非常准确地报告错误。这在黑暗中有点刺,但尝试:
SELECT
description,
(SELECT FirstName + ' ' FROM EMP_tblEmployee FOR XML PATH('')) AS [Name Concat Result]
FROM EMP_tblCrew
这至少会解决一件事,虽然我不确定SQL服务器对内联这样的连接感觉如何。如果您的表具有可观的大小,您还可能会溢出varchar(1000)。甚至varchar 8000也不是很适合这种查询。
答案 1 :(得分:1)
尝试搜索谷歌“SQL将行连接成字符串”。有许多有用的解决方案。
看起来您还需要将员工加入船员工作台,这样您就不会得到一些笛卡尔产品(通常不是想要的产品)。
答案 2 :(得分:0)
可能最简单的路径涉及使用递归CTE(公用表表达式)。一个详细的例子是https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
注意,这基本上要求你有sql 2008.
另一条路径是创建一个用户定义的函数,该函数返回EMP_tblEmployee表中的连接值。你可以在2005年或2008年这样做。