2011-11-15 8 views
2

私はこれらのconfigsのバージョンと一緒にいくつかのアプリケーションの構成設定を保持している私のDB内のテーブルを持っている:どこの句で入れ子の選択を取り除くのですか?

app_id | config | version 
-------------------------- 
app1 | conf1v1 | 1 
app2 | conf2v1 | 1 
app1 | conf1v2 | 2 

私は、アプリケーションごとに最新の構成(最大バージョン番号を持つもの)を取得する必要があります。私はこのようなクエリを使用します:

select c.app_id, c.config, c.version 
from config c  
where 
    c.version=(select max(c2.version) from config c2 where c2.app_id = c.app_id) 

しかし、これは非効率的なようです。私は、この作業を行うより効率的な方法があるのだろうか?

+0

「*非効率だと思われる」と言ったらどういう意味ですか?あなたは実際に測定しましたか?あなたは実行計画を調査しましたか?それにもかかわらず、私は、このクエリが非効率的であるという明らかな理由は見当たりません。 –

+0

@BrankoDimitrijevic私はwhere節でselectを実行すると、各行のヒットがクエリによって返されると考えられます。 –

+0

@BrankoDimitrijevicこのテーブルにはどのようなインデックスを作成する必要がありますか? –

答えて

4

分析関数を使用できます。それはテーブルを2度打つのを避けるので、少なくとももう少し効率的になります。 (利用可能な場合、さらに読み込みを減らすために、インデックスを使用して)

ROW_NUMBERとのCTEを(組み合わせ
SELECT app_id, config, version 
    FROM (SELECT app_id, 
       config, 
       version, 
       row_number() over (partition by app_id order by version desc) rnk 
      FROM config) 
WHERE rnk = 1 
1

)は、テーブルの単一の解析が可能になります...

WITH 
    reversioned_config 
AS 
(
    SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY app_id ORDER BY version DESC) as descending_version 
    FROM 
    config 
) 
SELECT 
    app_id, 
    config, 
    version 
FROM 
    reversioned_config 
WHERE 
    descending_version = 1 
+0

ダウン投票者はなぜ理由を挙げることができますか? – MatBailie

0

select app_id, config, MAX(version) version from config 
group by app_id, config 
について
+0

configsが異なると仮定しているので、クエリはアプリのさまざまな設定に対して重複した行を返します。 –

関連する問題