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并将其应用于笛卡尔积的结果是极其低效的,因为表很大,尤其是它们的笛卡尔积。
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 解决方案返回的行数将根据分配相同随机数的行数而变化。某些行可能会多次使用,而其他行则根本不会使用。您还应该了解表中有多少行才能使用该解决方案。
| 归档时间: |
|
| 查看次数: |
2174 次 |
| 最近记录: |