我有一个查询
Select
(SELECT id FROM xyz M WHEREM.ID=G.ID AND ROWNUM=1 ) TOTAL_X,
count(*) from mno G where col1='M' group by col2
现在从子查询我必须为此获取ramdom id
Select
(SELECT id FROM xyz M WHEREM.ID=G.ID AND ROWNUM=1 order by dbms_random.value ) TOTAL_X,
count(*) from mno G where col1='M' group by col2
但是,oracle显示错误
"Missing right parenthesis".
查询有什么问题,我怎样才能获得随机ID。 请帮忙。
答案 0 :(得分:5)
即使您所做的是合法的,也不会给您想要的结果。 ROWNUM过滤器将在ORDER BY之前应用,因此您只需对一行进行排序。
你需要这样的东西。我不确定这个确切的代码是否适用于相关的子查询,但基本的一点是你需要有一个子查询包含没有ROWNUM过滤器的ORDER BY,然后将ROWNUM过滤器应用一级。
WITH subq AS (
SELECT id FROM xyz M WHERE M.ID=G.ID order by dbms_random.value
)
SELECT (SELECT id FROM subq WHERE rownum = 1) total_x,
count(*)
from mno g where col1='M' group by col2
答案 1 :(得分:2)
您无法在子选择中使用order by。这也没关系,因为首先应用行编号,所以你不能通过使用order by来影响它,
[编辑]
试过一个解决方案。不要让Oracle在这里,所以你必须在拼写错误之间阅读。 在这种情况下,我生成一个随机值,获取每个mno.id的xyz记录数,并为每个mno.id生成这些记录的序列。
然后,更高级别,我只过滤那些索引与随机值匹配的记录。 这应该给你一个xyz的随机id,它与mno中的id匹配。
select
x.mnoId,
x.TOTAL_X
from
(SELECT
g.id as mnoId,
m.id as TOTAL_X,
count(*) over (partition by g.id) as MCOUNT,
dense_rank() over (partition by g.id) as MINDEX,
r.RandomValue
from
mno g
inner join xyz m on m.id = g.id
cross join (select dbms_random.value as RandomValue from dual) r
where
g.col1 = 'M'
) x
where
x.MINDEX = 1 + trunc(x.MCOUNT * x.RandomValue)
答案 2 :(得分:1)
你的两行之间的唯一区别是你在一个失败的那个中订购了,对吧? 碰巧order_by不适合嵌套选择。
但是,您可以在包含select的where子句中执行order_by。
编辑:@StevenV是对的。
答案 3 :(得分:0)
如果您正在尝试做我怀疑的事情,这应该可行
Select A.Id, Count(*)
From MNO A
Join (Select ID From XYZ M Where M.ID=G.ID And Rownum=1 Order By Dbms_Random.Value ) B On (B.ID = A.ID)
GROUP BY A.ID