2016-05-23 101 views
0

我遇到了一些代码给我的问题。它不是按照它应该连接的行。我从3个表中选择要连接的行。我有一个CommentWorkOrderTWorkMaterial_nonFiltered表。for xml路径不连接SQL Server中的SQL查询中的行

Comment表显然有意见,并且与WorkMaterial_nonFiltered表相关联。 WorkMaterial_nonFiltered表连接到WorkOrderT表,这是工单ID的位置。

我正在尝试使用工单ID来获取该工单的所有注释,并将它们全部连接到每个工单ID的一行中。这里是代码,因为我目前拥有它:

select 
    wo.WOId as ID, 
    STUFF(cast((select distinct '; ' + c.comments 
       from working.Comment c 
       where c.Instance_InstanceId = wm.id 
       for xml path(''), type) as varchar(max)), 1, 1, ' ') as MaterialComments 
from 
    working.WorkOrderT wo 
left join 
    working.WorkMaterial_nonFiltered wm on wm.WorkOrder = wo.WOId 
where 
    wo.WOId = '00559FB6-4DD2-4762-8DE1-8D1B13962AED' 
order by  
    [MaterialComments] 

当我运行这个我得到11行作为结果。第一个将MaterialComments作为NULL,然后其他人在其中有数据。我不关心NULL行,除非是导致问题的原因,我需要将其他人连接在一起,并用“;”分隔。我已经尝试了一步一步地完成这一步,但我一直无法弄清楚为什么我总是得到11行而不是1。我已经研究了以下其他问题以尝试找到解决方案:

Concatenate many rows into a single text string?

Concatenate Rows using FOR XML PATH() from multiple tables

How to create a SQL Server function to “join” multiple rows from a subquery into a single delimited field?

How to make a query with group_concat in sql server

String Aggregation in the World of SQL Server

到目前为止,我还没有能够从这些链接得到任何建议为我工作我仍然得到11行而不是1连续行。

编辑

下面是我在我的表中的一些样本数据:(注知道如何做出草率格式化这个实际的表遗憾)

WorkOrderID        Comments 
00559FB6-4DD2-4762-8DE1-8D1B13962AED 5/17 caj in transit; expected delivery on 5/18 per ups 1Z25AR580319345668 
00559FB6-4DD2-4762-8DE1-8D1B13962AED 5/18 caj updated esd on 6/17 per vendor site 
00559FB6-4DD2-4762-8DE1-8D1B13962AED 5/17 caj allocated to ship 
00559FB6-4DD2-4762-8DE1-8D1B13962AED 5/17 caj updated esd on 5/27 per vendor site 
00559FB6-4DD2-4762-8DE1-8D1B13962AED 5/18 caj processed; no udpated delivery date per estes Tracking #/BOL #: 3SNS31780960 
00559FB6-4DD2-4762-8DE1-8D1B13962AED 5/18 caj processed; no updated delivery date per ups 1Z39ER600354622348 
008FC1D1-D6A6-4E48-A69F-168DBF8D215A Jun 25 2015 10:22AM;dlb223;6/25 dlb 1Z4370490304215160 to be dlv'd today 
008FC1D1-D6A6-4E48-A69F-168DBF8D215A Jun 8 2015 1:11PM;klh323;6/8 klh Reserved to meet 06/30 requested delivery date 
008FC1D1-D6A6-4E48-A69F-168DBF8D215A Jun 25 2015 10:23AM;dlb223;6/23/2015 
008FC1D1-D6A6-4E48-A69F-168DBF8D215A Jun 25 2015 10:23AM;dlb223;6/5 dlb 1Z4370490304215937 to be dlv'd today 
008FC1D1-D6A6-4E48-A69F-168DBF8D215A Jun 25 2015 10:24AM;dlb223;6/25 dlb 1Z4370490304216445 to be dlv'd today 
00910B84-486C-4AD4-9B1E-5F8D8B42C841 5/12 jad IN TRANSIT; EXPECTED DELIVERY 5/12 PER UPS 1Z750WA20313280446 
00910B84-486C-4AD4-9B1E-5F8D8B42C841 4/29 jad IN TRANSIT; EXPECTED DELIVERY 4/29 PER UPS 1Z39ER600354244542 

结果我希望是这样的:(再次,我不知道如何使这样的表)

WorkOrderID          Comments 
00559FB6-4DD2-4762-8DE1-8D1B13962AED   5/17 caj in transit; expected delivery on 5/18 per ups 1Z25AR580319345668; 5/18 caj updated esd on 6/17 per vendor site; 5/17 caj allocated to ship; 5/17 caj updated esd on 5/27 per vendor site; 5/18 caj processed; no udpated delivery date per estes Tracking #/BOL #: 3SNS31780960; 5/18 caj processed; no updated delivery date per ups 1Z39ER600354622348 
008FC1D1-D6A6-4E48-A69F-168DBF8D215A   Jun 25 2015 10:22AM;dlb223;6/25 dlb 1Z4370490304215160 to be dlv'd today; Jun 8 2015 1:11PM;klh323;6/8 klh Reserved to meet 06/30 requested delivery date; Jun 25 2015 10:23AM;dlb223;6/23/2015; Jun 25 2015 10:23AM;dlb223;6/5 dlb 1Z4370490304215937 to be dlv'd today; Jun 25 2015 10:24AM;dlb223;6/25 dlb 1Z4370490304216445 to be dlv'd today 
00910B84-486C-4AD4-9B1E-5F8D8B42C841   5/12 jad IN TRANSIT; EXPECTED DELIVERY 5/12 PER UPS 1Z750WA20313280446; 4/29 jad IN TRANSIT; EXPECTED DELIVERY 4/29 PER UPS 1Z39ER600354244542 

我希望,这使我更清楚试图完成。

+0

要使整个查询连接到XML文档中,外部查询还必须具有FOR XML子句。你已经正确地把类型参数放在内部查询中。如果你想在XML中嵌入XML,这是必需的。如果您的查询按其写入方式工作,则只需在其末尾添加一个FOR XML子句即可。 – quest4truth

+0

这并不像我期望的那样工作。对于只有1个'WOId',它将所有内容放在一行中,但是如果我删除了这个约束并将其打开以提取所有工作订单,它会将所有工单的所有注释放入同一行。每个工单都需要一个单独的行。这就是为什么我选择了'wo.WOId'。 – Mike

+0

我想我不应该理解你想要的结果。你能告诉我一些示例数据和理想结果吗? – quest4truth

回答

0

我已经结束了使用传递查询到链接的服务器。这就是问题的实际来源。数据从链接服务器返回。一旦我明白,我能够得到我需要的结果。现在我有一个非常长的通过查询使用for xml,并给我评论WOID的方式,我需要他们。

0

显式请求元素内的文本节点,而不是元素。

select 
    wo.WOId as ID, 
    (select distinct '; ' + c.comments as "text()" 
       from working.Comment c 
       where c.Instance_InstanceId = wm.id 
       for xml path(''), type) as "MaterialComments" 
from 
    working.WorkOrderT wo 
left join 
    working.WorkMaterial_nonFiltered wm on wm.WorkOrder = wo.WOId 
where 
    wo.WOId = '00559FB6-4DD2-4762-8DE1-8D1B13962AED' 
order by  
    [MaterialComments]