【问题标题】:How can I randomly distribute rows in one table to rows in another table in oracle SQL如何在oracle SQL中将一个表中的行随机分布到另一个表中的行
【发布时间】:2019-02-25 05:19:40
【问题描述】:

我正在尝试找出一个 SQL 查询,它将记录从一个表随机分布到另一个表。

例如: 我有一张客户表,我想从汽车表中为每个客户分配一辆汽车。

我想确保汽车是随机分配的,但客户没有属性可以预测他们会收到哪辆汽车。

客户: (乔恩、山姆、萨拉、杰克、亚当、阿德里安)

汽车: (宝马、道奇、雷克萨斯)

结果:

(乔恩-宝马、山姆-雷克萨斯、萨拉-宝马、杰克-道奇、亚当-道奇、阿德里安-宝马)

我如何在 Oracle SQL 中做到这一点?

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: sql oracle plsql


【解决方案1】:

这是一种选择:

SQL> with t as
  2    (select u.name ||'-'||a.name comb,
  3       row_number() over (partition by u.name order by dbms_random.value(1, n.cnt)) rn
  4     from customers u cross join cars a
  5     join (select count(*) cnt from cars) n on 1 = 1
  6    )
  7  select t.comb
  8  from t
  9  where rn = 1;

COMB
-----------------------------------------
Adam-Lexus
Adrian-BMW
Jack-Lexus
Jon-BMW
Sam-Dodge
Sara-Lexus

6 rows selected.

SQL>

【讨论】:

    【解决方案2】:

    一种可能比完全交叉连接更有效的方法是:

    select c.*, cc.car
    from (select c.*,
                 row_number() over (order by dbms_random.value(1, cc.cnt) as seqnum
          from customers c cross join
               (select count(*) as cnt from cars) cc
         ) c join
         (select cc.*, row_number() over (order by dbms_random.random) as seqnum
          from cars cc
         ) cc
         on cc.seqnum = c.seqnum;
    

    【讨论】:

      【解决方案3】:

      如果没有限制使用所有汽车和数据库资源:

      select customer_name||'-'||car_name result 
      from (
          select u.name customer_name, c.name car_name, 
              row_number() over ( partition by u.name order by dbms_random.value ) ord
          from customers u
          cross join cars c
      )
      where ord = 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-21
        • 2011-03-04
        • 2012-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        相关资源
        最近更新 更多