2017-02-21 72 views
1

我想在子查詢中選擇一個由日期字段DATETO排序的varchar字段SUBJECT。具體:最新條目的ONE主題字段,因此按日期字段排序。在SELECT子查詢中的ORACLE ORDER BY

SELECT MDKAMVP.MDKAMDA_SID, 
(select SUBJECT from mdkndlst where rownum=1 and SUBJECT is not null 
order by DATETO) NAKTION, MDKAMVP.ROWID ROW_ID 
FROM SPRINGV2.MDKAMVP order by MDKAMVP.INDSTATUS 

錯誤:

ORA-00907: Rechte Klammer fehlt 
00907. 00000 - "missing right parenthesis" 
*Cause:  
*Action: 
Fehler in Zeile: 8 Spalte: 99 

它的工作原理沒有order by DATETO

+0

正如你所看到的,Oracle不允許使用'爲了by'子句中使用在子查詢中。你能分享一下表格的結構,一些樣本數據和你試圖從樣本中得到的結果嗎? – Mureinik

+0

那ORDER BY沒有任何意義......你想用它來解決什麼? – jarlh

+0

@jarlh它是有道理的,我想獲得表mdkndlst的最新條目 –

回答

0

你應該使用FIRST_VALUE

SELECT mdkamvp.mdkamda_sid, 

    (SELECT DISTINCT first_value(subject) over (partition BY subject 
               ORDER BY dateto DESC) 
    FROM mdkndlst 
    WHERE subject IS NOT NULL) naktion, 
     mdkamvp.rowid row_id 
FROM springv2.mdkamvp 
ORDER BY mdkamvp.indstatus 
1

甲骨文12C,您可以使用新FETCH FIRST子句:

SELECT MDKAMVP.MDKAMDA_SID, 
     x.subject as NAKTION, 
     MDKAMVP.ROWID ROW_ID 
FROM SPRINGV2.MDKAMVP 
    cross join (
    select SUBJECT 
    from mdkndlst 
    where rownum=1 
     and SUBJECT is not null 
    order by DATETO DESC 
) x 
order by MDKAMVP.INDSTATUS; 

由於:

SELECT 
    mdkamvp.mdkamda_sid, 
    (SELECT subject 
     FROM mdkndlst 
     WHERE subject IS NOT NULL 
     ORDER BY dateto 
     FETCH FIRST 1 ROW ONLY) naktion, 
    mdkamvp.rowid row_id 
FROM springv2.mdkamvp 
ORDER BY mdkamvp.indstatus 
0

而是在選擇列表中使用標量子查詢,通過使用派生表,你沒有限制的順序派生表保證只返回一行,cross join不會改變整體結果。

如果您想要最新主題,您還應該訂購DATETO降序。沒有這一點,你會得到最古老的主題。

如果您使用12c,那麼您可能需要使用fetch first選項,如Jiri所示。

1

分配rownum到行正在申請ORDER BY條款之前進行,因此該查詢

SELECT subject 
FROM mdkndlst 
WHERE rownum = 1 
     AND subject IS NOT NULL 
ORDER BY dateto 

事實上返回一個隨機行。我相信這不是你想要的。您可能首先需要申請ORDER BY,然後取第一行。這就是子查詢可以派上用場:

SELECT subject 
FROM (SELECT subject 
     FROM mdkndlst 
     WHERE subject IS NOT NULL 
     ORDER BY dateto) 
WHERE rownum = 1 

和這樣的查詢你現在可以作爲一個標量子查詢

SELECT mdkamvp.mdkamda_sid 
     ,(SELECT subject 
     FROM (SELECT subject 
       FROM mdkndlst 
       WHERE subject IS NOT NULL 
       ORDER BY dateto) 
     WHERE rownum = 1) naktion 
     ,mdkamvp.rowid row_id 
FROM springv2.mdkamvp 
ORDER BY mdkamvp.indstatus