Sql 工作不正常
我简化了以下查询:Sql 工作不正常,sql,sql-server,tsql,Sql,Sql Server,Tsql,我简化了以下查询: with temp1 as ( select table1.variable1 ,table1.variable2 ,table2.variable3 from table1 left join table2 on table1.variable1 = table2.variable1 ) select distinct temp1.variable1 ,temp2.variable2 ,stuff((select ',' + table3.Description f
with temp1 as
(
select
table1.variable1
,table1.variable2
,table2.variable3
from table1
left join table2
on table1.variable1 = table2.variable1
)
select distinct
temp1.variable1
,temp2.variable2
,stuff((select ',' + table3.Description
from table3 t3 where t3.variable1 = temp1.variable1
for xml path ('')), 1, 1, '') AS 'Reason'
,table3.variable4
,table4.variable5
from temp1
left join table3
on temp1.variable1 = table3.variabl3
left join table4
on temp1.variable1 = table4.variable4
order by variable1
stuff/for xml语句在该行中多次复制描述,而不是将每个描述合并为每个变量1的一行。所以,我得到了这个:
*Reason:*
Variable1,Unit1||Excessive,Excessive,Excessive,Excessive
Variable1,Unit1||Unusual ,Unusual,Unusual ,Unusual
Variable1,Unit1||Under ,Under ,Under ,Under
Variable1,Unit1||Over ,Over ,Over ,Over
Instead of:
*Reason:*
Variable1,Unit1||Excessive, Unusual, Under, Over
三月份有人问了同样的问题,但没有人回答。希望有更好的运气,因为我已经在这个问题上工作了3天了 这是STUFF语句的预期行为,因为您正在STUFF语句外选择一列。众所周知的STUFF FOR XML路径技巧只有在sub-select没有从STUFF语句外部选择列时才起作用 同样的行为可以通过以下简单的方式观察到:
DECLARE @T1 TABLE (x INT, y CHAR(1));
INSERT @T1 VALUES (1, 'a'), (1, 'b'), (1, 'c'), (2, 'd'), (3, 'e'), (3, 'f');
SELECT DISTINCT T1.x, STUFF((SELECT ',' + T1.y FROM @T1 AS T2 WHERE T2.x = T1.x FOR XML PATH ('')), 1, 1, '')
FROM @T1 AS T1;
问题的出现是因为您在外部查询的某个部分上使用了STUFF,它实际上只是将外部结果集中的一列与其自身连接起来,连接的次数与variable1匹配的次数相同,例如,4个匹配将获得您看到的4个连接。比如说,如果变量2上有6个匹配项,就可以从中得到6个串联
对于您的问题,您要做的是确保您没有选择外部列,但仍然将where条件与外部列相匹配。例如,我会通过将其更改为:
DECLARE @T1 TABLE (x INT, y CHAR(1));
INSERT @T1 VALUES (1, 'a'), (1, 'b'), (1, 'c'), (2, 'd'), (3, 'e'), (3, 'f');
SELECT DISTINCT T1.x, STUFF((SELECT ',' + T2.y FROM @T1 AS T2 WHERE T2.x = T1.x FOR XML PATH ('')), 1, 1, '')
FROM @T1 AS T1;
唯一的区别是我从STUFF语句内部选择T2.y,而不是从它外部选择T1.y
因此,在您的例子中,您需要修改STUFF语句,使其如下所示:
STUFF((SELECT ',' + T3.[Description] FROM table3 AS T3 WHERE T3.variable1 = temp1.variable1 FOR XML PATH ('')), 1, 1, '') AS Reason
这是STUFF语句的预期行为,因为您正在STUFF语句外选择一列。众所周知的STUFF FOR XML路径技巧只有在sub-select没有从STUFF语句外部选择列时才起作用 同样的行为可以通过以下简单的方式观察到:
DECLARE @T1 TABLE (x INT, y CHAR(1));
INSERT @T1 VALUES (1, 'a'), (1, 'b'), (1, 'c'), (2, 'd'), (3, 'e'), (3, 'f');
SELECT DISTINCT T1.x, STUFF((SELECT ',' + T1.y FROM @T1 AS T2 WHERE T2.x = T1.x FOR XML PATH ('')), 1, 1, '')
FROM @T1 AS T1;
问题的出现是因为您在外部查询的某个部分上使用了STUFF,它实际上只是将外部结果集中的一列与其自身连接起来,连接的次数与variable1匹配的次数相同,例如,4个匹配将获得您看到的4个连接。比如说,如果变量2上有6个匹配项,就可以从中得到6个串联
对于您的问题,您要做的是确保您没有选择外部列,但仍然将where条件与外部列相匹配。例如,我会通过将其更改为:
DECLARE @T1 TABLE (x INT, y CHAR(1));
INSERT @T1 VALUES (1, 'a'), (1, 'b'), (1, 'c'), (2, 'd'), (3, 'e'), (3, 'f');
SELECT DISTINCT T1.x, STUFF((SELECT ',' + T2.y FROM @T1 AS T2 WHERE T2.x = T1.x FOR XML PATH ('')), 1, 1, '')
FROM @T1 AS T1;
唯一的区别是我从STUFF语句内部选择T2.y,而不是从它外部选择T1.y
因此,在您的例子中,您需要修改STUFF语句,使其如下所示:
STUFF((SELECT ',' + T3.[Description] FROM table3 AS T3 WHERE T3.variable1 = temp1.variable1 FOR XML PATH ('')), 1, 1, '') AS Reason
你能添加一些样本数据吗?嗯。。。您正在将表3.描述填充到您的stuff语句中,这是外部语句的一部分。。。因此,将table3.description与自身连接起来而不使用STUFF语句也没什么不同。。。您应该做的是修改您的内容,使其类似于表3中的STUFFSELECT','+[Description]作为T3,其中T3.variable1=temp1.variable1作为XML路径1,1的原因。这样,您就不会选择stuff语句之外的内容,您应该会得到所需的结果。stuff Select DISTINCT“,”…您可以添加一些示例数据吗?嗯。。。您正在将表3.描述填充到您的stuff语句中,这是外部语句的一部分。。。因此,将table3.description与自身连接起来而不使用STUFF语句也没什么不同。。。您应该做的是修改您的内容,使其类似于表3中的STUFFSELECT','+[Description]作为T3,其中T3.variable1=temp1.variable1作为XML路径1,1的原因。这样,您就不会选择stuff语句之外的内容,您应该会得到所需的结果。stuff Select DISTINCT“,”…谢谢您的帮助。但是,我真的是个新手。这是我的工作。因此,我不能透露任何真实的数据。为了让所有的事情都匿名,我把stuff语句打错了。你是如何演示stuff语句的,实际上就是我是如何做到的。而且它仍然没有把我对每个项目的所有描述都塞进一行。当我在它自己的查询中测试这个语句,设置临时表时,它的工作方式和它应该的完全一样。但是当我集成到我真正的查询中时,它将不起作用。虽然,基本上是一样的。还有其他建议吗?谢谢你的帮助。但是,我真的是个新手。这是我的工作。因此,我不能透露任何真实的数据。为了让所有的事情都匿名,我把stuff语句打错了。你是如何演示stuff语句的,实际上就是我是如何做到的。而且它仍然没有把我对每个项目的所有描述都塞进一行。当我在它自己的查询中测试这个语句,设置临时表时,它的工作方式和它应该的完全一样。但是当我集成到我真正的查询中时,它将不起作用。虽然,基本上是一样的。还有其他建议吗?