我想将一个表中的行分发到其他表中的行,这些行可以在SQL oracle中使用相同的行数

Nas*_*hdi 2 sql oracle plsql

我正在尝试编写一个SQL查询,该记录将记录从一个表分发到另一个表,该表采用相同的数字.

在这个例子中,我有两个表,Students并且Teachers,我想将学生分配给每个教师.

学生:(亚当,班纳特,埃尔默,贾斯汀,路易斯,诺亚,杰克)

老师:( Leo,Kyle,Ethan)

注意:

  1. 一个学生不能有一个以上的老师
  2. 每个老师应该和其他老师一样有相同数量的学生......
  3. ......除非学生人数不是教师人数的精确倍数,否则学生必须尽可能在教师之间平均分配

例如,如果我们有七名学生和三名教师,前两名教师将招收两名学生,最后一名将招收三名学生.

结果:

Student | Teacher
--------+--------
Adam    | Leo
Bennet  | Leo
Elmer   | Kyle
Justin  | Kyle
Louis   | Ethan
Noah    | Ethan
Jack    | Ethan
Run Code Online (Sandbox Code Playgroud)

我怎么能在Oracle SQL中做到这一点?

Kau*_*yak 6

这不一定按照您希望的顺序分配教师,但会按照您的意愿按比例分配教师.它使用该NTILE函数将名称放入存储桶并为每行分配适当的存储桶编号.

如果您希望订购,则必须为教师和学生提供唯一的Id列.

with tch as
(
 select t.*, row_number() OVER ( ORDER BY name ) as n from teachers t
 ),
ct AS
 ( 
  select count(*) as cnt from Teachers
  )
 select s.name as student,tch.name as teacher from
 (

     SELECT name, NTILE(cnt) OVER (partition by cnt ORDER BY name)  AS n 
         FROM Students cross join
       ct
) s join tch on tch.n = s.n;
Run Code Online (Sandbox Code Playgroud)

演示

 Student| Teacher 
 -----  | ----
 Adam   | Ethan
 Bennet | Ethan
 Elmer  | Ethan
 Jack   | Kyle 
 Justin | Kyle 
 Louis  | Leo  
 Noah   | Leo 
Run Code Online (Sandbox Code Playgroud)