2011-08-30 173 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