2017-06-20 20 views
0

我目前在SQL Server 2005中工作,表中包含数百万行。 表中有以下的行和列用于多个列组的sql server中的组concat性能

ID  PO_ID Event_ID Item_ID 
1  22  970  123456 
1  22  970  123457 
1  23  970  1234589 
1  22  971  12345790 
1  22  971  12345792 

我想Concat的列ITEM_ID多列组“身份证,PO_ID,EVENT_ID” 输出会是这样

ID  PO_ID Event_ID Item_ID 
    1  22  970  123456,123457 
    1  23  970  1234589 
    1  22  971  12345790,12345792 

我有以下SQL查询

select ID, PO_ID, Event_ID, 
     substring(
        (SELECT ','+ Item_ID) 
        FROM table as a 
        WHERE a.ID=table.ID 
        AND a.PO_ID=table.PO_ID 
        and a.event_ID=table.event_ID 
        FOR XML PATH ('') 
        ) 
from table 
group by ID,PO_ID,Event_ID; 

但这种查询是在性能方面很慢 有任何优化的方式做这在SQL Server 2005中? 任何帮助将不胜感激。

注意:我没有创建UDF或索引的权限。

+0

您是否至少尝试搜索解决方案? 它花了我几秒钟才发现: https://stackoverflow.com/questions/15154644/group-by-to-combine-concat-a-column –

+0

[GROUP BY之后连接一个字段]的可能重复(https://stackoverflow.com/questions/13647394/concatenate-one-field-after-group-by) –

+0

感谢您的回复 是的我搜索解决方案,我有相同的SQL查询上述问题。 根据以上解决方案 1)它使用SQL Server 2005不支持的东西功能。 2)除了子串之外,我的查询与解决方案相同。我只是要求提供性能建议,因为表中有100万行 –

回答

0

我会建议写这篇为:

select ID, PO_ID, Event_ID, 
     stuff((select ',' + a.Item_ID) 
       from table a 
       where a.ID = t.ID and 
        a.PO_ID = t.PO_ID and 
        a.event_ID = t.event_ID 
       FOR XML PATH ('') 
      ), 1, 1, '' 
      ) as items 
from (select distinct ID, PO_ID, Event_ID 
     from table t 
    ) t; 

那么对于性能,你想在(ID, PO_ID, Event_ID, Item_Id)的索引。

0

您可能在桌面上创建一个索引,这可以帮助您