2016-09-16 5 views
-1

私は最適化が必要なサブクエリを持っています。これは、労働組合とこれを行う方法はありSQL:同じテーブルで3 LEFT OUTER JOINを使用するクエリを最適化します

を外部結合を残した?... 3列は、それぞれから自分のデータを結合得るということで

でitemInventoryに3回参加している「LastDate」私はこれをより効率的に置き換えるためのクエリを想像するのは難しいと感じました。

はここにクエリです:

select 
ii1.vendorno, 
ii1.Quantity1, 
ii3.date1, 
ii1.fgspecialpo, 
ii1.itemid, 
ii1.LastDate as [LastDate1], 
ii2.LastDate as [LastDate2], 
ii3.LastDate as [LastDate3], 
ii1.qtytype as [qtytyp], ii1.quantity2 as [qty2], ii2.Quantity1 as [itemsAddlQty], 
ii3.quantity1 as [Exp Qty] 
from iteminventory ii1  
    left outer join (select * from iteminventory where qtytype=11) ii2 on ii1.itemid=ii2.itemid and ii1.fgspecialpo=ii2.fgspecialpo and ii1.vendorno=ii2.vendorno  
    left outer join (select * from iteminventory where qtytype=1) ii3 on ii1.itemid=ii3.itemid and ii1.fgspecialpo=ii3.fgspecialpo and ii1.vendorno=ii3.vendorno 

答えて

2

UNIONは、ここであなたを支援するつもりはありません。 UNIONは、ここで持っていない2つの結果セットを結合するために使用されます。これらのサブクエリの代わりにジョインを使用するように、これを単純化することはできます。私はそれが実際の実行計画に大きな違いをもたらさないと思う。パフォーマンスに問題がある場合は、インデックスを含むテーブル定義を参照する必要があります。これを変換する方法は、単に結合を使用する方法です。

SELECT ii1.vendorno 
    , ii1.Quantity1 
    , ii3.date1 
    , ii1.fgspecialpo 
    , ii1.itemid 
    , ii1.LastDate AS [LastDate1] 
    , ii2.LastDate AS [LastDate2] 
    , ii3.LastDate AS [LastDate3] 
    , ii1.qtytype AS [qtytyp] 
    , ii1.quantity2 AS [qty2] 
    , ii2.Quantity1 AS [itemsAddlQty] 
    , ii3.quantity1 AS [Exp Qty] 
FROM iteminventory ii1 
LEFT OUTER JOIN iteminventory ii2 ON ii1.itemid = ii2.itemid 
           AND ii1.fgspecialpo = ii2.fgspecialpo 
           AND ii1.vendorno = ii2.vendorno 
           AND ii3.qtytype = 11 
LEFT OUTER JOIN iteminventory ii3 ON ii1.itemid = ii3.itemid 
           AND ii1.fgspecialpo = ii3.fgspecialpo 
           AND ii1.vendorno = ii3.vendorno 
           AND ii3.qtytype = 1 
+0

@BhatiaAshishを。あなたはqtytype = 11を追加するのに間違いありませんでした。 –

+0

私はオリジナルに対してあなたのやり方を試してみました。探し続けなければならない...ありがとう。少し学んだ。そして、私はテーブルのデフを共有することはできません...(とにかく、私たちはデータベースを変更することはできません) –

+0

これとあなたがそれを元のやり方は非常に異なるだろうと私は驚くだろう。パフォーマンスが向上する前に、この表の索引付けを改善する必要があります。しかし、そのような詳細がなければ誰もが推測している。 –

2

私はそれを正しく理解している場合、私はそれだけの問題qtytype列の値に応じて、異なる列のデータを示したのだと思います。私はあなたがこれに参加する必要はないと思う。


チェックこれはあなたのために働く場合:私はあなたの編集を読み違え

SELECT 
    vendorno, 
    Quantity1, 
    CASE WHEN qtytype=1 THEN date1 ELSE NULL END as date1, 
    fgspecialpo, 
    itemid, 
    LastDate as [LastDate1], 
    CASE WHEN qtytype=11 THEN LastDate ELSE NULL END as [LastDate2], 
    CASE WHEN qtytype=1 THEN LastDate ELSE NULL END as [LastDate3], 
    qtytype as [qtytyp], 
    quantity2 as [qty2], 
    CASE WHEN qtytype=11 THEN Quantity1 ELSE NULL END as [itemsAddlQty], 
    CASE WHEN qtytype=1 THEN quantity1 ELSE NULL END as [Exp Qty] 
FROM iteminventory 
+0

これで最初のクエリと同じ結果が得られません。 'date1'は値を持つレコードの場合はnullです。オリジナルからのOUTERは、この新しいものよりも多くのデータを持ち込んでいます。あなたが参加条件のために複数の行を持っている場合、差異を示す –

+0

@Beauをスクリーンショットに貼り付けることができます。ii1.itemid = ii2.itemidとii1.fgspecialpo = ii2.fgspecialpoとii1.vendorno = ii2.vendorno予想よりも多くの行オリジナルのクエリにDISTINCT句を追加すると、重複する行が削除され、クエリの結果が返され、クエリがより近くなります。あなたのクエリが元のテーブル行よりも多くの行を返さないようにするもう1つのこと。 –

+0

参考までに、それ以上の行ではない列のデータを追加しています。いくつかの列は新しい方法でヌルで、古いテーブル(外側の結合を使用)は、左の表に一致する列があるかどうかに関わらず明示的に他の列を持ち込みます...ヘルプのおかげで、インデックス/スキーマの変更。今、戦いのために。 –

関連する問題