1

我通常使用 MS SQL,并且是 oracle 的新手。

ORDER BY当我在子查询中使用该语句时,我遇到了 oracle 驱动程序问题。

示例(我的真实陈述要复杂得多,但我怀疑这对我的问题很重要 - 如果需要,我可以发布它):

SELECT col1
     , col2
     , (SELECT colsub FROM subtbl WHERE idsub = tbl.id AND ROWNUM=1 ORDER BY coldate) col3
FROM tbl

如果我做这样的构造,我会得到一个 odbc 驱动程序错误:ORA-00907:缺少右括号(从德语翻译,所以括号可能是其他词 :))。

如果我删除ORDER BY coldate一切正常。我找不到任何原因,所以我做错了什么?

4

3 回答 3

2

尝试:

select
  col1,
  col2,
  colsub
from(
  select
    col1   ,
    col2   ,
    coldate,
    max(coldate) over (partition by st.idsub) max_coldate
  from
    tbl    t,
    subtbl st
  where
    st.idsub = t.id)
where
  coldate = max_coldate
于 2012-05-24T10:50:29.230 回答
2

你做错了什么很清楚。您在子查询中使用 order by。在子查询中使用 order by 没有任何意义,那么为什么要这样做呢?此外,您在始终返回 1 行的子查询上使用 order by。这也没有任何意义。

如果您希望对查询结果进行排序,请在最高级别使用 order by。

于 2012-05-24T10:38:02.867 回答
2

以这种方式编写 ROWNUM 和 ORDER BY 没有任何意义,因为 ORDER BY 是在 WHERE 子句之后评估的,这意味着它在这种情况下无效。这个问题给出了一个例子。

这也变得有点复杂,因为如果嵌套太深,很难将子查询连接回主查询。

下面的查询不一定有效,因为您不能以这种方式在 tbl 和 subtbl 之间加入。

SELECT 
  col1,
  col2,
  (
    select colsub
    from  (
      SELECT colsub 
       FROM subtbl 
       WHERE idsub = tbl.id
       order by coldate
    )
    where rownum = 1
  ) as col3
FROM tbl

因此,您需要使用某种分析函数,如下例所示:

SELECT 
  col1,
  col2,
  (SELECT max(colsub) keep (dense_rank first order by coldate) as colsub
   FROM subtbl 
   WHERE idsub = tbl.id
   group by idsub
) col3
FROM tbl

FIRST分析函数比它需要的复杂,但它会完成工作。

另一种选择是使用ROW_NUMBER也可以解决问题的分析函数。

SELECT 
  col1,
  col2,
  (select colsub
   from (
     SELECT 
       idsub, 
       row_number() over (partition by idsub order by coldate) as rown,
       colsub
   FROM subtbl a 
   ) a
   WHERE a.idsub = tbl.id
   and a.rown = 1
) col3
FROM tbl
于 2012-05-24T10:52:55.003 回答