GROUP BY子句中的ORDER BY

时间:2011-08-30 12:26:24

标签: sql oracle plsql

我有一个查询

 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。 请帮忙。

4 个答案:

答案 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