2017-08-30 10 views
1

基本的に、EXTテーブルの複数の行からデータを取得したいとします。どのようにテーブル内の複数の行からクエリ照合データを最適化できますか?

Select package_id from EXT WHERE 
(ITEM_PARAM_ATTR_NAME='Charge code' and ITEM_PARAM_ATTR_VALUE='WDATRM') 
INTERSECT 
Select package_id from EXT WHERE 
(ITEM_PARAM_ATTR_NAME='Charge code' and ITEM_PARAM_ATTR_VALUE='WDA4RM') 
INTERSECT 
Select package_id from EXT WHERE Priority > 299 
INTERSECT 
Select package_id from EXT WHERE 
(ITEM_PARAM_ATTR_NAME='Rate table rate' and ITEM_PARAM_ATTR_VALUE='0.00000953') 
INTERSECT 
Select package_id from EXT WHERE 
(ITEM_PARAM_ATTR_NAME='Usage category group' and ITEM_PARAM_ATTR_VALUE='H'); 
+0

は世界をEAVへようこそ。 – lad2025

+0

どのDBMSを使用していますか? –

+0

@YellowBedwetterそのOracle –

答えて

0

私が間違っていなければ、それはすべて選択が同じテーブルの上にあるので、好きになりそうだ、この:

Select package_id from EXT WHERE 
(ITEM_PARAM_ATTR_NAME='Charge code' and ITEM_PARAM_ATTR_VALUE='WDATRM') 
AND 
(ITEM_PARAM_ATTR_NAME='Charge code' and ITEM_PARAM_ATTR_VALUE='WDA4RM') 
AND 
(Priority > 299) 

秒:

Select package_id from EXT WHERE 
(ITEM_PARAM_ATTR_NAME='Charge code' and ITEM_PARAM_ATTR_VALUE='WDATRM') 
INTERSECT 
Select package_id from EXT WHERE 
(ITEM_PARAM_ATTR_NAME='Charge code' and ITEM_PARAM_ATTR_VALUE='WDA4RM') 
INTERSECT 
Select package_id from EXT WHERE Priority > 299 

は、これと同じ結果が得られますアプローチはより読みやすく、実行するのが速くなるだろうと私は思っています。

+0

私が提供する解決策の問題は、あなたが私のSQLを見ると共通のpackage_idsと交差していることです。しかし、それを提供したクエリは交差しないので、連合のように機能し、交差しません。例:テーブルに3行あり、Package_idが1の場合ITEM_PARAM_ATTR_VALUE = 'WDATRM'、Package_idが1の場合ITEM_PARAM_ATTR_VALUE = 'WDA4RM'また、別の行がPackage_idが2の場合ITEM_PARAM_ATTR_VALUE = 'WDATRM' urクエリーが返されます両方ともpackage_idsが返されますが、Package_idのみが返されます。1 –

+0

@PalashManawat昼食に行く前にこれをすばやく入力していたかもしれませんが、「OR」の代わりに「AND」を使用するとソリューションが機能すると思います。そうすれば、すべての述部が真(行のように)の行だけが返されます。 – Dessma

+0

違反はありませんが、その問題の解決策が簡単なのであれば、私はそれを知っていたでしょう... ANDの問題は複数の行ではうまくいかないということです。交差点と2番目はINを使用しています.... INは非常に非常に遅く、交差点はINより速いですが、交差点が最適ではないように感じます。 –

0

私はそれがより速くなるだろうかどうかわからないんだけど、あなたはJOINのベースのアプローチに打撃

SELECT CON1.package_id 
    FROM (SELECT DISTINCT package_id 
      FROM EXT 
     WHERE ITEM_PARAM_ATTR_NAME = 'Charge code' 
      AND ITEM_PARAM_ATTR_VALUE = 'WDATRM' 
     ) CON1 
INNER 
    JOIN (SELECT DISTINCT package_id 
      FROM EXT 
     WHERE ITEM_PARAM_ATTR_NAME = 'Charge code' 
      AND ITEM_PARAM_ATTR_VALUE = 'WDA4RM' 
     ) CON2 
    ON CON1.package_id = CON2.package_id 
INNER 
    JOIN (SELECT DISTINCT package_id 
      FROM EXT 
     WHERE Priority > 299 
     ) CON3 
    ON CON1.package_id = CON3.package_id  
INNER 
    JOIN (SELECT DISTINCT package_id 
      FROM EXT 
     WHERE ITEM_PARAM_ATTR_NAME = 'Rate table rate' 
      AND ITEM_PARAM_ATTR_VALUE = '0.00000953' 
     ) CON4 
    ON CON1.package_id = CON4.package_id  
INNER 
    JOIN (SELECT DISTINCT package_id 
      FROM EXT 
     WHERE ITEM_PARAM_ATTR_NAME = 'Usage category group' 
      AND ITEM_PARAM_ATTR_VALUE = 'H' 
     ) CON5 
    ON CON1.package_id = CON5.package_id  

EDIT与えることができる:最初のものは動作しなかったことを。多分INTERSECTSはそれが得られるほど良いです。この方が良ければ、私は驚くだろうが、おそらく。

SELECT DISTINCT package_id 
    FROM (SELECT MAX(CASE WHEN ITEM_PARAM_ATTR_NAME = 'Charge code' 
         AND ITEM_PARAM_ATTR_VALUE = 'WDATRM' THEN 1 
         ELSE 0 
       ) OVER 
       (PARTITION BY package_id) CON1, 
       MAX(CASE WHEN ITEM_PARAM_ATTR_NAME = 'Charge code' 
         AND ITEM_PARAM_ATTR_VALUE = 'WDA4RM' THEN 1 
         ELSE 0 
       ) OVER 
       (PARTITION BY package_id) CON2, 
       MAX(CASE WHEN Priority > 299 THEN 1 
         ELSE 0 
       ) OVER 
       (PARTITION BY package_id) CON3, 
       MAX(CASE WHEN ITEM_PARAM_ATTR_NAME = 'Rate table rate' 
         AND ITEM_PARAM_ATTR_VALUE = '0.00000953' THEN 1 
         ELSE 0 
       ) OVER 
       (PARTITION BY package_id) CON4, 
       MAX(CASE WHEN ITEM_PARAM_ATTR_NAME = 'Usage category group' 
         AND ITEM_PARAM_ATTR_VALUE = 'H' THEN 1 
         ELSE 0 
       ) OVER 
       (PARTITION BY package_id) CON5, 
       CON1 + CON2 + CON3 + CON4 + CON5 AS ALLCON 
      FROM EXT  
     ) TMP 
WHERE ALLCON = 5; 
+0

すべてのあなたの努力のために働きました。その成果が十分にあるかどうかを確認してください –

+0

パフォーマンスの観点から、私のクエリはより速く動作しています。私はそれを言って申し訳ありません:)。 –

+0

バマー、私は代替案を追加しましたが、それはより良いとは思いません。 ITEM_PARAM_ATTR_NAMEまたはITEM_PARAM_ATTR_VALUEに索引が定義されていますか? –

0
SELECT DISTINCT (package_id) 
    FROM EXT 
WHERE Item_param_attr_name = 'Usage category group' 
    AND Item_param_attr_value = 'H' 
    AND package_id IN 
     (SELECT DISTINCT (package_id) 
      FROM EXT 
     WHERE Item_param_attr_name = 'Charge code' 
      AND Item_param_attr_value = 'WDATRM' 
      AND Priority > 299 
      AND package_id IN 
       (SELECT DISTINCT (package_id) 
        FROM EXT 
       WHERE Item_param_attr_name = 'Charge code' 
        AND Item_param_attr_value = 'WDA4RM' 
        AND package_id IN 
         (SELECT DISTINCT (package_id) 
          FROM EXT 
         WHERE ITEM_PARAM_ATTR_NAME = 'Rate table rate' 
          AND ITEM_PARAM_ATTR_VALUE = '0.00000953'))); 
+0

@YellowBedwetterこれは今のところ最適です。 –

+0

@Dessmaありがとうございます。 –

関連する問題