我有这个查询:
SELECT
tc.dv_task,
tc.dv_ci_item,
STUFF((
SELECT ',' + lob.name
FROM u_cmdb_ci_line_of_business lob
where lob.sys_id = tc.ci_item
GROUP BY tc.dv_task
FOR XML PATH('') ), 1, 1, '') AS LOBs
FROM task_ci tc
INNER JOIN u_cmdb_ci_line_of_business lob on tc.ci_item = lob.sys_id
它返回以下错误:消息164,级别15,状态1,第8行每个GROUP BY表达式必须至少包含一个不是外部引用的列。
我使用的是Microsoft SQL Server 2016(SP2-GDR((KB4505220(-13.0.5101.9(X64(
以下是我想要实现的:我有两个表task_ci(tc(和u_cmdb_line_of_business(lob(。表通过tc.ci_item=lob.sys_id连接。对于tc表上的每个dv_task,我想要一行在逗号分隔的字段中列出lob表中的相关ci_items。这就是为什么我尝试按dv_task分组。
If I take out the group by, I get this:
tc.dv_task LOBs (Stuff field)
123456 lob.ci_item 1
123456 lob.ci_item 2
我想要这个:dv_task LOB(填充字段(123456 lob。ci_item1,lob.ci_item2
但当我通过添加该组时,试图将内容放在一行中,我会出现错误。希望这是有道理的。
有人能告诉我我做错了什么吗?
编辑:03/23
好吧,我明白了,我只是把它改成了像这样的子字符串
select
inc.number,
substring((select ', ' + lob.name from task_ci tc
join u_cmdb_ci_line_of_business lob on lob.sys_id = tc.ci_item
where inc.sys_id = tc.task
for XML PATH('')),2,1000) as lob_sysid
from incident inc
where inc.number = 'INC1157655'
我仍然不确定我在STUF上做错了什么,但我会在不同的表上尝试一下,看看它是如何工作的。
谢谢你的帮助。
我认为您不需要外部查询中的JOIN
:
SELECT tc.dv_task, tc.dv_ci_item,
STUFF((SELECT ',' + lob.name
FROM u_cmdb_ci_line_of_business lob
WHERE lob.sys_id = tc.ci_item
FOR XML PATH('')
), 1, 1, '') AS LOBs
FROM task_ci tc;
好吧,我明白了,我只是把它改成了像这样的子字符串
select
inc.number,
substring((select ', ' + lob.name from task_ci tc
join u_cmdb_ci_line_of_business lob on lob.sys_id = tc.ci_item
where inc.sys_id = tc.task
for XML PATH('')),2,1000) as lob_sysid
from incident inc
where inc.number = 'INC1157655'
我仍然不确定我在STUF上做错了什么,但我会在不同的表上尝试一下,看看它是如何工作的。
谢谢你的帮助。