Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 工作不正常_Sql_Sql Server_Tsql - Fatal编程技术网

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语句的,实际上就是我是如何做到的。而且它仍然没有把我对每个项目的所有描述都塞进一行。当我在它自己的查询中测试这个语句,设置临时表时,它的工作方式和它应该的完全一样。但是当我集成到我真正的查询中时,它将不起作用。虽然,基本上是一样的。还有其他建议吗?