0

これを 1 つの方法で実行する方法は知っていますが、作成したクエリの実行には約 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

これがあなたを助けることを願っています。

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 に答える
1

問題の 1 つは、 の 5 つの異なる値に対してテーブル全体を 5 回スキャンしていることですfieldname。その列にインデックスを付けていない場合は、より良いでしょう。

また、 に索引を付けた方がよいでしょうOrderNumber

このクエリをプログラム (Web ページなど) から呼び出す場合は、そのプログラムでデータを "ピボット" する方が簡単な場合があります。データを取得して配列に書き込み、行ではなく列として読み戻します。(これは、データが膨大ではないことを前提としています。)

インデックス作成に関するいくつかのリンクを追加するために編集されました:

于 2012-08-29T20:59:52.993 に答える