2016-05-03 4 views
0

せずに、いくつかの集計関数ベースの条件で1行を選択:私はそこにユーザ注文により、および(Oracleで)ROWNUMよりも、これを解決するために、よりエレガントな方法だが、ここに行くかどうかわからないんだけど、サブクエリ

私はこれを持っていますテーブル(勝者と呼ばれる):

Name  Salary  House Kids 
-------------------------------- 
Barabara 2500.00 40  4 
Dale  2000.00 60  3 
Aaron 2000.00 45  2 
Joe  2000.00 45  4 
Jacob 2000.00 50  4 
Melissa 2500.00 50  4 

ハウスは、

「優勝者」(名前はありますが、列にはさらに多くの列を含めることができます)が見つかるクエリ(サブクエリなし)が必要です。 「勝者」はそうのように定義されています。

  • は最低の給料を稼いで
  • (同数の場合には:)最小の家を持っている
  • (別同数の場合には:)子供の数が最も多いです。この例では

、勝者は2000年を稼いジョーは、45の家の大きさを持っており、4人の子供を持っています。別の方法にはあり

select * 
from 
    (select name 
    from winner 
    order by salary, house, kids desc) 
where rownum = 1; 

唯一の方法である(それでもインデックスのみと非常にシンプルでありながら効率的なコードを持っており、すなわち、)サブクエリ(インラインのようなものを持っている別の選択を持っています)サブクエリを使わずにそうしますか? (おそらく集合関数ですか?)

+0

あなたは 'join'を考えますか? – Bulat

+0

これはあなたの問題を解決するための標準的な方法です。サブクエリ*なしでクエリ*が必要なのはなぜですか? – mathguy

+0

それは割り当てです。 私は 'join 'と考えることができます。それが唯一の方法だと思いますか? – Neer

答えて

1

、あなたはkeepを使用することができます。

select max(name) keep (dense_rank first order by salary, house, kids desc) as name, 
     max(salary) keep (dense_rank first order by salary, house, kids desc) as name, 
     max(house) keep (dense_rank first order by salary, house, kids desc) as name, 
     max(kids) keep (dense_rank first order by salary, house, kids desc) as name 
from rownum_order_test; 

あなたはネクタイをしたい場合は、試してみることもできます:

select listagg(name, ',') keep (dense_rank first order by salary, house, kids desc) as names 
from rownum_order_test; 

この構成は、相関サブクエリを使用して作業する場合、Oracleの相関句のスコープが限られているため、非常に便利です。値を取得するときに注意してください。

Bulatで説明したように、Oracle 12c +ではfetch first 1 row onlyを使用するより良い方法があります。また、first_value()select distinctを使用する別の方法があります。これらのどちらもネクタイの解決策を提供しません。

+0

最初のものが動作します(11gは既に_earlier_バージョンと考えられていますか?:-)) – Neer

1

もしあなたが12cを試してみたらFETCH FIRST ROW ONLY

詳細については、こちらの記事を参照してください:https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1

例は次のようになります。Oracleの以前のバージョンでは

SELECT val 
FROM rownum_order_test 
ORDER BY val DESC 
FETCH FIRST 5 ROWS ONLY; 

     VAL 
---------- 
     10 
     10 
     9 
     9 
     8 

5 rows selected. 

SQL> 
+1

私は11gですが、とにかく、ありがとうと、これについては知らなかった:-) – Neer

関連する問題