oracle中的随机连接

str*_*cer 1 sql oracle random join

我有三个查询,我希望结果行由这些查询的条目组成,这些查询彼此随机连接。

我不想合并结果,而是以或多或少随机的方式加入它们(可以保留原始分布,或者可以统一所有结果)。

我尝试了以下方法:

select * 
from 
(
    SELECT street, number 
    FROM Addresses 
    WHERE valid = '1' 
    order by Dbms_Random.Value
) q1 ,
(
    select prename 
    from person 
    order by Dbms_Random.Value
) q2 , 
(
    select surname 
    from person 
    order by Dbms_Random.Value
) q3
Run Code Online (Sandbox Code Playgroud)

然而,我的结果集看起来根本不是随机的:

Main street, 1, Andre, Smith
Main street, 1, Andre, Warnes
Main street, 1, Andre, Jackson
Main street, 1, Andre, Macallister
Run Code Online (Sandbox Code Playgroud)

从查询中删除ORDER BY并将其应用于笛卡尔积的结果是极其低效的,因为表很大,尤其是它们的笛卡尔积。

dbe*_*ham 5

Colin 't Hart 诊断了这个问题,并建议使用 rownum 进行解决。但解决方案稍微复杂一些,因为如果 ROWNUM 都出现在同一个 SELECT 中,则它们会在 ORDER BY 之前分配。解决方案是添加一个额外的子查询级别。

with randomAddress as(
  select rownum id, street, num from (
    select * from addresses where valid=1 order by dbms_random.random
  )
),
randomPrename as(
  select rownum id, prename from(
    select * from person order by dbms_random.random
  )
),
randomSurname as(
  select rownum id, surname from(
    select * from person order by dbms_random.random
  )
)
select street, num, prename, surname
  from randomAddress
  join randomPrename using(id)
  join randomSurname using(id)
;
Run Code Online (Sandbox Code Playgroud)

此解决方案将始终返回等于最小表中的行数的随机行数。任何行都不会被使用多次。这是SQL Fiddle

GWu 解决方案返回的行数将根据分配相同随机数的行数而变化。某些行可能会多次使用,而其他行则根本不会使用。您还应该了解表中有多少行才能使用该解决方案。