--■■■配列型を使わない方法■■■
select 操縦士ID,操縦可能機
from 操縦士 a
where 操縦士ID != 6
and exists(select b.操縦可能機 from 操縦士 b
where b.操縦士ID = a.操縦士ID
intersect all
select c.操縦可能機 from 操縦士 c
where c.操縦士ID = 6
intersect all
select d.飛行機名 from 工場 d)
order by 操縦士ID,操縦可能機;
--■■■any述語を使う方法1■■■
select 操縦士ID,操縦可能機
from (select 操縦士ID,操縦可能機,
array_agg(操縦可能機) over(partition by 操縦士ID) as arrayPlane
from 操縦士
where 操縦士ID != 6) a
where exists(select 飛行機名 from 工場
intersect all
select b.操縦可能機 from 操縦士 b
where b.操縦士ID = 6
and b.操縦可能機 = any(a.arrayPlane))
order by 操縦士ID,操縦可能機;
--■■■any述語を使う方法2■■■
select 操縦士ID,操縦可能機
from (select 操縦士ID,操縦可能機,
array_agg(操縦可能機) over(partition by 操縦士ID) as arrayPlane
from 操縦士
where 操縦士ID != 6) a
where exists(select 飛行機名 from 工場
where 飛行機名 = any(a.arrayPlane)
intersect all
select b.操縦可能機 from 操縦士 b
where b.操縦士ID = 6)
order by 操縦士ID,操縦可能機;
--■■■&&述語を使う方法■■■
select 操縦士ID,操縦可能機
from (select 操縦士ID,操縦可能機,
array_agg(操縦可能機) over(partition by 操縦士ID) as agg1,
array_agg(case when 操縦士ID = 6
and exists(select 1 from 工場 b
where b.飛行機名 = a.操縦可能機)
then 操縦可能機 end) over() as agg2
from 操縦士 a) a
where 操縦士ID != 6
and agg1 && agg2
order by 操縦士ID,操縦可能機;