5

TAB私は2つのフィールドを持つAテーブルを持っていますとは であり、Bです。AVarchar2(50)BDate

これらの値があるとします。

 A  |      B
------------------
 a1 | 01-01-2013
 a2 | 05-05-2013
 a3 | 06-06-2013
 a4 | 04-04-2013

Afieldの最大値に対応するfield の値が必要です。Bつまり、 を返す必要がありa3ます。

私はこの要求をしました:

select A 
from TAB 
where 
B = (select max(B) from TAB)

しかし、このソリューションのようにネストされた選択を避けたいです。

解決策についてのアイデアはありますか?

ありがとうございました

4

3 に答える 3

2

あなたが望むものを達成するための4つの異なる方法をリストしたsqlfiddleを作成しました。あなたの例に別の行を追加したことに注意してください。したがって、最大の日付を持つ 2 つの行があります。クエリの違いがわかりますか? Manoj の方法では、2 つの行が条件に一致しますが、1 つの行しか得られません。[実行計画の表示] をクリックすると、SQL Server がこれらのクエリを処理する方法の違いを確認できます。

4 つの異なる方法 (標準 SQL で記述されているため、すべての RDBMS で動作するはずです):

select A 
from TAB 
where 
B = (select max(B) from TAB);


select top 1 * from tab order by b desc;


select 
*
from
tab t1
left join tab t2 on t1.b < t2.b
where t2.b is null;


select
*
from
tab t1
inner join (
  select max(b) as b from tab
  ) t2 on t1.b = t2.b;

ここでは、a_horse_with_no_name のおかげで、特に SQL Server 向けの 2 つの方法があります。

select *
from (
  select a, 
         b,
         rank() over (order by b desc) as rnk  
  from tab
) t
where rnk = 1;

select *
from (
  select a,
         b, 
         max(b) over () as max_b
  from tab
) t
where b = max_b;

彼らがここで働いているのを見てください。

于 2013-07-01T08:53:15.053 に答える