【问题标题】:Populating relationship table randomly from two entity tables Postgresql从两个实体表Postgresql中随机填充关系表
【发布时间】:2023-03-20 08:38:01
【问题描述】:

我正在尝试一个简单的 E-R,其中两个实体集是:学生和大学各有大约 200 行,关系为“应用”[因此学生申请大学]

我的学生表有一些数据,但主键是 Student_ID

大学有 Universy_Name 作为 PK;

现在关系 - “应用” - 我有 student_ID 和 University_Name 作为 FK 和 application_ID 作为 PK

我必须填充这个“应用”表,其中包含大约 10% 随机选择的可能关系,使用一个单独的 INSERT 语句和可能的“random()”函数。有谁知道如何随机使用其他两个表中的值填充表?

【问题讨论】:

  • 我认为在选择学生时可以使用ORDER BY random()LIMIT。对于每个选定的学生,您可以使用相同的机制选择一所大学,只需 LIMIT 1。 200 行是一个很小的数字,查询的性能应该不用担心。

标签: sql postgresql


【解决方案1】:

你会使用:

insert into applies (student_id, university_name)
    select s.student_id, u.university_name
    from students s cross join
         universities u
    order by random()
    limit 4000;

或者,您可以在不排序的情况下使用:

insert into applies (student_id, university_name)
    select s.student_id, u.university_name
    from students s cross join
         universities u
    where random() < 0.1;

请注意,这是大约 10% 的行样本,而不是精确计数。

【讨论】:

  • 这很完美!非常感谢你的帮助!我也将看看另一种方法而不进行排序并尝试使用它:)
  • @priceless32 。 . .如果这回答了您的问题,您可以接受答案。一般来说,你应该接受一个答案(你只能接受一个)。
【解决方案2】:

您可以交叉连接这两个表以获取学生和大学的所有组合。然后以随机顺序对您的行进行编号,并保留数字

insert into applies (student_id, university_name)
  select student_id, university_name
  from
  (
    select 
      s.student_id, 
      u.university_name,
      row_number() over (order by random()) as rn,
      count(*) over () as cnt
    from student s 
    cross join university u
  ) randomized
  where rn <= cnt / 10.0;

【讨论】:

    【解决方案3】:

    我复制了你的案例

    create table students (student_id serial primary key, name varchar);
    create table university (University_Name varchar primary key);
    insert into students (name) values ('Francesco');
    insert into students (name) values ('Laura');
    insert into students (name) values ('Christian');
    insert into students (name) values ('Ugo');
    insert into students (name) values ('Maria');
    insert into students (name) values ('Antonietta');
    
    insert into university values ('Bocconi');
    insert into university values ('Universita di Pisa');
    insert into university values ('Universita di Padova');
    insert into university values ('Universita di Perugia');
    
    

    如果你对申请多所大学的学生没有任何限制,你可以实现插入

    select * from students cross join university order by random() limit 3;
    

    limit 3 仅显示 3 行

    【讨论】:

    • JOININNER JOIN 的缩写,并且需要 ON 子句,因为内部连接在条件上连接。使用ON 1 = 1 可以实际交叉连接表,即无条件连接,但这是不必要的错误,因为您真正想要的只是CROSS JOIN,而不是INNER JOIN。因此使用FROM students CROSS JOIN university
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多