2011-08-02 21 views
0

行と商品で一意の製品名を指定して、大量の製品リストを配列に集めます。それから私はそれを私のSQLステートメントのWHERE節にフィードします。この製品リストがかなり大きくなると、WHERE句もまた醜い混乱に発展します。だから私のWHERE句は次のように見ることができるものの例は以下の通りです:SQL(DB2)WHERE句の最適化

WHERE FOO = 'Y' 
AND ((iline = ? AND iitem = ?) 
OR (iline = ? AND iitem = ?) 
OR ... 
OR (iline = ? AND iitem = ?)) 

などなど、どこの各 "ILINE = AND iitem =?"ユニークな製品です。私はこれについて専門家ではないことは明らかですが、私のWHERE句に時折100以上のORがあるようなことはあまり効率的ではないと思います。

ありがとうございました。

答えて

0

私はそれが任意のより効率的である疑いがありますが、代わりにcase文を使用することができます。

WHERE 
    FOO = 'Y' 
    AND iline = CASE iitem 
       WHEN ? THEN ? 
       WHEN ? THEN ? 
       ... 
       END 
+0

さて、私はそれに感謝します。 – Bead

1

あなたはこのようなものを使用することができます

Presuming, iline has values like A,B,C,D,E.... and iitem posses 1,2,3,4,5... Now, you need combinations to be satisfied like 
(iline = 'A' AND iitem = '2'), 
(iline = 'E' AND iitem = '2'), 
(iline = 'B' AND iitem = '3'), 
(iline = 'A' AND iitem = '3'), 
(iline = 'E' AND iitem = '2'), 
(iline = 'B' AND iitem = '4') 

は、これはおそらく

に絞ることができます
WHERE FOO = 'Y' 
AND (iline = 'A' and iitem IN ('2','3')) 
AND (iline = 'B' and iitem IN ('3','4')) 
AND (iline = 'E' and iitem IN ('2','3')) 

理想的には、次を追加する必要があります。

  • ilineの条件があるときのAND
  • 既存の条件のINに別のリテラル。あなたは、むしろ新しいORを追加するよりも、新しい条件(iline = 'B' and iitem = '5')を追加する必要がある場合、あなたは、単にリテラルを追加することができます言う「5」(iline = 'B' and iitem IN ('3','4','5'))

のような=「B」条件希望既存ILINEに私は私の概念が明らかにしましたあなたの質問を教えてください。

+0

私は同意する、それは私が思ったより良いです。 –