2011-08-30 128 views
1

我有一个查询ORDER BY在GROUP BY子句

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 

但是,甲骨文显示错误

"Missing right parenthesis". 

查询有什么问题,我该如何查询这个查询来获得随机ID。 请帮忙。

+0

我没有得到你想在这里做什么;你是否试图使用内部select中的一个随机记录来选择记录以在外部计数? – StevenV

回答

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 
2

您不能在子查询中使用顺序。它不会有问题也是如此,因为该行的编号是第一个应用,所以你无法通过使用顺序影响它,

[编辑]

尝试的解决方案。在这里没有Oracle,所以你必须阅读错别字。 在这种情况下,我生成一个随机值,获取每个mno.id中xyz记录的计数,并为每个mno.id的记录生成一个序列。

然后,一个更高的级别,我只筛选索引与随机值匹配的那些记录。 这应该给你一个随机的ID从xyz匹配的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) 
+0

是的,但有办法解决它。 –

+0

有,但我必须考虑(并键入)一分钟才能拿出一个。 – GolezTrol

1

你的两条线唯一的区别是你order_by在失败的那一行中,对吗? 恰巧那个order_by不适合嵌套选择。

但是,您可以在包含select的where子句中执行order_by。

编辑:@StevenV是对的。

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