トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

8-32 最大値または最小値のレコードを求める

SQLパズル

empTable
ename  sal
-----  ---
Ada    100
Jane   100
Tom    700
Dick   800
Wendy  900

Salが最大値または最小値のレコードを求める。

出力結果
ename  sal
-----  ---
Ada    100
Jane   100
Wendy  900

SQLクックブックのレシピ11.6を参考にさせていただきました


データ作成スクリプト

create table empTable(ename,sal) as
select 'Ada'  ,100 from dual union all
select 'Jane' ,100 from dual union all
select 'Tom'  ,700 from dual union all
select 'Dick' ,800 from dual union all
select 'Wendy',900 from dual;


SQL

--■■■分析関数を使う方法■■■
select ename,sal
  from (select ename,sal,
        min(sal) over() as minSal,
        max(sal) over() as maxSal
        from empTable)
 where sal in(minSal,maxSal)
order by sal,ename;

--■■■分析関数を使わない方法■■■
select ename,sal
  from empTable a
 where exists(select 1 from empTable b
              having a.sal in(min(b.sal),max(b.sal)))
order by sal,ename;


解説

分析関数を使わない方法では、
exists述語とhaving句を組み合わせて使ってます。