T-SQL最有效的排列?交叉对XML路径,枢轴
-
26-09-2019 - |
题
我要寻找最高效的办法把行转换成列。我没有要求输出分贝的内容(下面不实际的架构,但概念是相似的)在两个固定的宽度和分隔格式。下面的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
构建体是更好的为多列值以单串列“转动”操作。
我不知道为什么你的效果不理想。你对表有什么索引?什么是你的执行计划是什么样子?
不隶属于 StackOverflow