gpt4 book ai didi

Oracle选择匹配连接条件的随机行

转载 作者:行者123 更新时间:2023-12-03 19:33:50 28 4
gpt4 key购买 nike

我的目标很简单,只要部门在某个特定部门(比如 2),我就必须创建一个临时表,其中包含来自员工表的一些随机值。对于其他部门,我不关心该值,它可以是 NULL

目前我有以下内容:

create table test 
as
select s.DEPTNAME,
cast (
(case when s.DEPTID in (2) then
(SELECT a.ENAME FROM
(SELECT b.ENAME, b.DEPTID FROM EMPLOYEE b
WHERE b.DEPTID IS NOT NULL
ORDER BY DBMS_RANDOM.VALUE) a
WHERE a.DEPTID = s.DEPTID AND ROWNUM = 1
)
END)
AS VARCHAR2(30)) "ENAME" from DEPARTMENT s;

但这里的主要问题与性能有关。对于 2 中的每个部门值,我们做一个 EMPLOYEE 表来获得一个随机的 ENAME。有一个更好的方法吗 ?我知道样本可能有效,但我想获得更多随机性。

最佳答案

第一个想法 - 加入随机编号的名​​字:

with 
e as (select ename, deptid, row_number() over (order by dbms_random.value) rn
from employee where deptid = 2),
c as (select count(1) cnt from e),
d as (select deptname, deptid, round(dbms_random.value(1, c.cnt)) rn from department, c)
select d.deptname, e.ename from d left join e using (rn, deptid)

SQLFiddle demo

对我有用的第二种可能的解决方案是创建从表 employee 返回随机 ename 的函数并在您的查询中使用它,但它可能会更慢。


编辑 - 根据评论:

如果出于某种原因,你的语句的第一部分是“固定的”,那么你可以使用这种语法:

create table test as 
select deptname, ename from (
with
e as (select ename, deptid, row_number() over (order by dbms_random.value) rn
from employee where deptid = 2),
c as (select count(1) cnt from e),
d as (select deptname, deptid, round(dbms_random.value(1, c.cnt)) rn
from department cross join c)
select d.deptname, e.ename from d left join e using (rn, deptid));

关于Oracle选择匹配连接条件的随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33777501/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com