0

我知道如何以一种方式执行此操作,但我创建的查询大约需要 1:30 才能运行,并且由于系统限制,我需要对其进行优化以更快。我已经使用同一个表的多个连接来执行此操作,但想知道是否有更短的查询或更有效的查询我可以使用。

我给出了一个查询示例,但它确实从下面引用的 OrderItemFormDateFields 表的行中提取了大约 100 列。我已经创建了列,我得到了我需要的结果,但同样,它很慢。如果您需要有关表格的更多详细信息,请告诉我。

我想我基本上是在寻找一种动态填充而不是列出每一列的方法。我已经看到了一些使用枢轴和案例语句的不同方式,但我对枢轴还不是很好,而且案例似乎效率更低。谢谢!

SELECT
OrderNumber
,Product
,OrderDate
,   oifd1.value as  'ADD_SUBJ_ADDRESS'
,   oifd2.value as  'ADD_SUBJ_BATHS'
,   oifd3.value as  'ADD_SUBJ_BEDROOMS'
,   oifd4.value as  'ADD_SUBJ_DATE'
,   oifd5.value as  'ADD_SUBJ_GLA'
FROM(
SELECT CAST(oi.orderid as VARCHAR(MAX))+'.'+CAST(oi.orderitemid as VARCHAR(MAX))     as      OrderNumber
,p.abbreviation as product, o.orderdate
FROM OrderItems oi
join products p on p.productid = oi.productid
join orders o on o.orderid = oi.orderid)x
left    join    orderitemformdatafields     oifd1   on      oifd1.orderreference    =   OrderNumber and oifd1.fieldname in  (     'SUBJ_STREET_ADDR')
left    join    orderitemformdatafields     oifd2   on      oifd2.orderreference    =   OrderNumber and oifd2.fieldname in  (      'ADD_SUBJ_BATHS')
 left   join    orderitemformdatafields     oifd3   on      oifd3.orderreference    =   OrderNumber and oifd3.fieldname in  (      'ADD_SUBJ_BEDROOMS')
 left   join    orderitemformdatafields     oifd4   on     oifd4.orderreference =   OrderNumber and oifd4.fieldname in  (     'ADD_SUBJ_DATE')
left    join    orderitemformdatafields     oifd5   on      oifd5.orderreference    =   OrderNumber and oifd5.fieldname in  (     'ADD_SUBJ_GLA')
4

2 回答 2

1

您的问题之一是您要扫描整个表五次以查找 的五个不同值fieldname。如果您不索引该列,则最好。

另外,您最好在OrderNumber.

如果您从程序(例如网页)调用此查询,则可能更容易“透视”该程序中的数据。获取数据,将其写入数组,然后将其作为列而不是行读回。(假设数据并不庞大。)

编辑添加一些关于索引的链接:

于 2012-08-29T20:59:52.993 回答
1

希望这会帮助你。

select * from (
SELECT CAST(oi.orderid as VARCHAR(MAX))+'.'+CAST(oi.orderitemid as VARCHAR(MAX))     as      OrderNumber
,p.abbreviation as product, o.orderdate
,oifd.value as value
,oifd.fieldname as fieldname
FROM OrderItems oi
join products p on p.productid = oi.productid
join orders o on o.orderid = oi.orderid
left join orderitemformdatafields     oifd   on  oifd.orderreference = CAST(oi.orderid as VARCHAR(MAX))+'.'+CAST(oi.orderitemid as VARCHAR(MAX))
) as p
PIVOT
(
    MAX(value) FOR fieldname in ([SUBJ_STREET_ADDR],[ADD_SUBJ_BATHS],[ADD_SUBJ_BEDROOMS],[ADD_SUBJ_DATE],[ADD_SUBJ_GLA])
)AS pvt
于 2012-08-29T21:09:44.160 回答