2017-02-21 104 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