RDMS には伝えていませんが、次のコードは Oracle (および SQL Server と思われます) で機能します。他の人にとっては、機能のエミュレーションがありrow_number
ます。
--creating table..
CREATE TABLE "YOURTABLE"
( "TIP" VARCHAR2(20),
"IDE" NUMBER
)
--inserting experimental values..
insert into YOURTABLE (TIP, IDE)
values ('History', 1);
insert into YOURTABLE (TIP, IDE)
values ('History', 1);
insert into YOURTABLE (TIP, IDE)
values ('Geography', 1);
insert into YOURTABLE (TIP, IDE)
values ('Geography', 2);
insert into YOURTABLE (TIP, IDE)
values ('French', 2);
insert into YOURTABLE (TIP, IDE)
values ('French', 3);
insert into YOURTABLE (TIP, IDE)
values ('English', 3);
insert into YOURTABLE (TIP, IDE)
values ('English', 4);
insert into YOURTABLE (TIP, IDE)
values ('History', 4);
insert into YOURTABLE (TIP, IDE)
values ('History', 4);
--code..
select m.*
from (select *
from YOURTABLE
where tip = 'History'
union
select *
from YOURTABLE
where tip = 'Geography'
and ide not in (select ide from YOURTABLE where tip = 'History')
union
select tip, ide
from (select s.*,
ROW_NUMBER() OVER(PARTITION BY ide ORDER BY ide) ord
from YOURTABLE s
where tip not in ('History', 'Geography')
and ide not in
(select ide
from YOURTABLE
where tip in ('History', 'Geography')))
where ord = 1) m
結果のテーブル:
TIP IDE
-------------------- ----------
History 1
Geography 2
English 3
History 4
あなたが言った:
歴史、地理、その他すべての「タイプ階層」
私の例では、フランス語ではなく英語が結果になりましたが、「その他すべて」が等しく作成されるため、これは問題になりません。