我要寻找最高效的办法把行转换成列。我没有要求输出分贝的内容(下面不实际的架构,但概念是相似的)在两个固定的宽度和分隔格式。下面的FOR XML路径查询给我我想要的结果,但比少量数据的其他任何问题时,可以需要一段时间。

 select orderid
   ,REPLACE((  SELECT '  ' + CAST(ProductId as varchar)
       FROM _details d
       WHERE d.OrderId = o.OrderId
       ORDER BY d.OrderId,d.DetailId
       FOR XML PATH('')
   ),' ','') as Products
 from _orders o

我看枢轴但大多数示例我已发现被聚集的信息。我只是想给孩子行结合起来,它们钉到父。

我还应该指出我并不需要任一处理的列名,因为子行的输出将或者被固定宽度的字符串或分隔字符串。

例如,考虑下面的表:

OrderId     CustomerId
----------- -----------
1           1
2           2
3           3

DetailId    OrderId     ProductId
----------- ----------- -----------
1           1           100
2           1           158
3           1           234
4           2           125
5           3           101
6           3           105
7           3           212
8           3           250

有关的命令我需要输出:

orderid     Products
----------- -----------------------
1             100  158  234
2             125
3             101  105  212  250

orderid     Products
----------- -----------------------
1           100|158|234
2           125
3           101|105|212|250

的思考或建议?我使用SQL Server 2K5。

实施例设置:

   create table _orders (
  OrderId int identity(1,1) primary key nonclustered
  ,CustomerId int
 )

 create table _details (
  DetailId int identity(1,1) primary key nonclustered
  ,OrderId int 
  ,ProductId int
 )

 insert into _orders (CustomerId)
 select 1
 union select 2
 union select 3

 insert into _details (OrderId,ProductId)
 select 1,100
 union select 1,158
 union select 1,234
 union select 2,125
 union select 3,105
 union select 3,101
 union select 3,212
 union select 3,250

 CREATE CLUSTERED INDEX IX_CL__orders on _orders(OrderId)
 CREATE NONCLUSTERED INDEX IX_NCL__orders on _orders(OrderId)
 INCLUDE (CustomerId)

 CREATE CLUSTERED INDEX IX_CL_details on _details(OrderId)
 CREATE NONCLUSTERED INDEX IX_NCL_details on _details(OrderId)
 INCLUDE (DetailId,ProductId)

使用FOR XML路径:

 select orderid
   ,REPLACE((  SELECT '  ' + CAST(ProductId as varchar)
       FROM _details d
       WHERE d.OrderId = o.OrderId
       ORDER BY d.OrderId,d.DetailId
       FOR XML PATH('')
   ),' ','') as Products
 from _orders o
然而

,其输出我想要的,是很慢的对大量数据。其中一个子表的是超过200万行,推的处理时间来〜4小时。

orderid     Products
----------- -----------------------
1             100  158  234
2             125
3             101  105  212  250
有帮助吗?

解决方案

根据定义,PIVOT将不得不以某种方式聚集,因为你可以有相同的枢轴键列多行。如果你不这样做有多行,这很好 - 但你仍然需要选择一个聚合运算符(MIN,MAX,SUM)

FOR XML PATH构建体是更好的为多列值以单串列“转动”操作。

我不知道为什么你的效果不理想。你对表有什么索引?什么是你的执行计划是什么样子?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top