t1 ID Kind Disc -- ---- ---- 1 A aaaa 1 B bbbb 2 A xxxx 3 A yyyy 3 B zzzz 4 B ssss テーブル :t1 ID (PK) Kind (PK) Disc がある。 Kindはチェック制約により'A'、'B' の2種類しか格納できない。 Kind が'B'のレコードを出力したいが、 IDについて'A'しか存在しないレコードの場合は'A'を出力させたい。 IDについて'A'、'B'の両方の種類が存在するレコードも存在するし、 'A'のみ、'B'のみのレコードも存在する。 出力結果 ID Kind Disc -- ---- ---- 1 B bbbb 2 A xxxx 3 B zzzz 4 B ssss
create table t1( ID number(1), Kind char(1) check (Kind in('A','B')), Disc char(4), primary key (ID,Kind)); insert into t1(ID,Kind,Disc) values(1,'A','aaaa'); insert into t1(ID,Kind,Disc) values(1,'B','bbbb'); insert into t1(ID,Kind,Disc) values(2,'A','xxxx'); insert into t1(ID,Kind,Disc) values(3,'A','yyyy'); insert into t1(ID,Kind,Disc) values(3,'B','zzzz'); insert into t1(ID,Kind,Disc) values(4,'B','ssss'); commit;
--■■■相関サブクエリを使う方法■■■ select ID,Kind,Disc from t1 a where Kind = 'B' or (Kind = 'A' and not exists(select 1 from t1 b where b.ID=a.ID and b.Kind='B')) order by ID; --■■■分析関数を使う方法■■■ select ID,Kind,Disc from (select ID,Kind,Disc, max(Disc) over(partition by ID) as MaxDisc from t1) where Disc = MaxDisc order by ID; --■■■Keepを使う方法■■■ select ID,max(Kind) as Kind, max(Disc) Keep(Dense_Rank Last order by Kind) as Disc from t1 group by ID order by ID;
相関サブクエリを使う方法では、 KindがAの場合は、 IDが同じで、KindがBのレコードの存在しないことをexistsでチェックしてます。