2017-06-28 2 views
0

私はSQLの初心者ですが質問があります。SQLクエリ - パフォーマンスとクエリ内のイントラセレクトの使用

このクエリは、すべてのフィールドでcontainer_id名を宣言して、すばやく簡単に機能します。

SELECT MASTER_CONTAINER_ID 
FROM CONTAINER_HISTORY A 
WHERE ACTION_TS IN 
    (SELECT MIN(ACTION_TS) 
    FROM (SELECT * 
     FROM CONTAINER_HISTORY 
     WHERE CONTAINER_ID = 'abc' 
     AND PUTAWAY_DATE IN 
      (SELECT MIN(PUTAWAY_DATE) 
      FROM CONTAINER_HISTORY 
      WHERE CONTAINER_ID = 'abc'))) 
AND CONTAINER_ID = 'abc' 
ORDER BY ACTION_TS DESC; 

どのようにして、さまざまな選択項目にすべてのcontainer_idsを接続できますか?これを行うより良い方法はありますか?

+1

このクエリを書くには、はるかに簡単な方法があります。あなたはサンプルデータと希望の結果で別の質問をする必要があります。 –

答えて

1

私はこのクエリはあなたと同等だと思う:あなたは複数回のクエリに比べて同じテーブルを参照するときに異なる表の別名を使用する必要があります

select a.master_container_id 
from container_history a 
where action_ts in 
    (select min(b.action_ts) 
    from container_history b 
    where b.container_id = a.container_id 
    and b.putaway_date in 
     (select min(c.putaway_date) 
     from container_history c 
     where c.container_id = b.container_id)) 
and a.container_id = 'abc' 
order by a.action_ts desc; 

注意。

(私は目にそれが非常に簡単に見つけるので、NBは私がちょうど小文字に切り替え!)

+0

ありがとう、それは動作します。初心者の質問に申し訳ありません、ちょうどSQLに入る –

0

ここで分析機能を使用して、一つの方法です:

SELECT container_id, 
     master_container_id, 
     putaway_date, 
     action_ts 
FROM (SELECT container_id, 
       master_container_id, 
       putaway_date, 
       action_ts, 
       MIN(CASE WHEN putaway_date = min_putaway_date THEN action_ts END) OVER (PARTITION BY container_id) min_action_ts_per_min_pa_dt 
     FROM (SELECT container_id, 
         master_container_id, 
         putaway_date, 
         action_ts, 
         MIN(putaway_date) OVER (PARTITION BY container_id) min_putaway_date 
       FROM container_history)) 
WHERE action_ts = min_action_ts_per_min_pa_dt; 

N.B.テストされていない。

これは、まず、container_historyテーブルのすべての行で各container_idの最小putaway_dateを計算します。

次に、putaway_dateが最も早いときに、最小action_tsを実行します。

最後に、以前に識別された最小action_tsに一致するaction_tsを持つ行を選択します。

N.B.分析関数はcontainer_idによってパーティション化されているため、外部セレクトにwhere句をwhere container_id = '<val>'とすると、Oracleは述語をインライン・ビューにプッシュすることができます。つまり、特定の分析関数に対して分析関数を実行するだけですcontainer_id(s)。外部問合せの述語にcontainer_idのフィルタリングが含まれていない場合は、フィルタリングを実行する前に、すべてのcontainer_idsで分析関数を実行する必要があります。パフォーマンスの影響があるため、これについて言及します。

関連する問題