トップページに戻る    次の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関数を使って、均等になるようにしてます。