2012-08-09 50 views
2

我試圖從表中返回7個事件,從今天的日期,並將它們按日期順序排列:順序由甲骨文子查詢不工作

SELECT ID 
FROM table 
where ID in (select ID from table 
where DATEFIELD >= trunc(sysdate) 
order by DATEFIELD ASC) 
and rownum <= 7 

如果我「借命令」刪除它返回該ID很好,查詢工作,但它沒有在正確的順序。將不勝感激任何幫助,因爲我似乎無法弄清楚我做錯了什麼!

(編輯)澄清,我之前用這個,和順序返回真的了:

select ID 
from TABLE 
where DATEFIELD >= trunc(sysdate) 
and rownum <= 7 
order by DATEFIELD 

感謝

+1

您的子選擇缺少條件(沒有'WHERE'而是'和')。你請糾正語法錯誤?對於用於「IN」運算符的子選擇使用ORDER BY是有意義的。 IN的項目順序是未定義的,不會被保留 – 2012-08-09 11:20:38

+0

謝謝,我在發佈之後立即修復了它們(我在發佈之前大量簡化了SQL) - 我只使用了一個聲明,因爲我之前一個沒有工作,我也會發佈一個。 – Nick 2012-08-09 11:24:58

+0

你有結束,而不是右側子查詢 – 2012-08-09 11:25:46

回答

9

ROWNUM「功能」的值在之前應用ORDER BY被處理。這就是爲什麼它不像你使用它的方式(See the manual有類似的解釋)

當使用ROWNUM限制查詢和涉及ORDER BY時,必須在內部選擇中完成排序並且限制必須是在外部施加的選擇:

select * 
from (
    select * 
    from table 
    where datefield >= trunc(sysdate) 
    order by datefield ASC 
) 
where rownum <= 7 
+0

非常感謝,完美的作品:) – Nick 2012-08-09 13:28:11

+0

正是我需要的,謝謝! – evandongen 2014-11-05 12:41:53

1

你的外部查詢着的「看」的順序,內部查詢,在這種情況下,在內部的順序沒有意義,因爲只使用它(內)創建將在外部WHERE上使用的數據子集,因此該子集的順序無關緊要。

也許如果你清楚地解釋你想做的事,我們可以幫你

3
  1. 不能在where id = (select id from ...)類型的子查詢使用order by。無論如何,這是沒有意義的。該條件僅檢查id是否在子查詢中。如果它影響輸出的順序,那只是偶然的。使用不同的數據查詢執行計劃可能會有所不同,輸出順序也會不同。在主查詢的末尾使用明確的order by

  2. 這是甲骨文衆所周知的'功能',rownumorder by不搭配很好。有關更多信息,請參閱http://www.adp-gmbh.ch/ora/sql/examples/first_rows.html。在你的情況,你應該使用類似:

    SELECT ID 
    FROM (select ID, row_number() over (order by DATEFIELD) r 
        from table 
        where DATEFIELD >= trunc(sysdate)) 
    WHERE r <= 7 
    

參見:

另請參閱關於SO的其他類似問題,例如。:

+0

非常感謝,我收到了一些很好的迴應,這可能是通過您的解釋和鏈接最好和非常有趣的閱讀。 – Nick 2012-08-09 13:29:18

0

ORDER BY子句中的子查詢: ORDER BY子句中不允許子查詢中,用內嵌視圖的例外。如果嘗試包含ORDER BY子句,則會收到錯誤消息

內聯視圖是from子句中的查詢。

SELECT t.* FROM (SELECT id, name FROM student) t