トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
7-68 ランダムに結合
SQLパズル
JobTable EmpTable
JobID EmpName
-------- --------
JobABC EmpAAA
JobDEF EmpBBB
JobGHI EmpCCC
JobJKL
JobMNO
JobPQR
JobSTU
JobTableとEmpTableを
1レコードに対して1レコード、ランダムに結合させる。
ただし、
EmpTableの各レコードとの結合数が、
なるべく均等になるようにする。
出力結果
JobID EmpName
-------- --------
JobABC EmpAAA
JobDEF EmpBBB
JobGHI EmpCCC
JobJKL EmpAAA
JobMNO EmpBBB
JobPQR EmpCCC
JobSTU EmpAAA
SQL
with JobTable as
(select 'JobABC' as JobID from dual
union select 'JobDEF' from dual
union select 'JobGHI' from dual
union select 'JobJKL' from dual
union select 'JobMNO' from dual
union select 'JobPQR' from dual
union select 'JobSTU' from dual),
EmpTable as
(select 'EmpAAA' as EmpName from dual
union select 'EmpBBB' from dual
union select 'EmpCCC' from dual)
select a.JobID,b.EmpName
from (select JobID,Row_Number() over(order by dbms_random.random()) as Rank
from JobTable) a,
(select EmpName,Row_Number() over(order by dbms_random.random()) as Rank,
count(*) over() as RecordCount
from EmpTable) b
where mod(a.Rank,b.RecordCount)+1 = b.Rank
order by b.EmpName,a.JobID;
解説
mod関数を使って、均等になるようにしてます。