【问题标题】:Error on Partition over row number分区超过行号的错误
【发布时间】:2014-11-18 19:42:46
【问题描述】:

我正在创建一个子查询来选择特定列 DIS_COL 上的不同条目,然后返回这些不同条目的所有其他列,任意选择第一行。

为此,我创建了一个子查询,它使用 over-partition by 仅选择第一行,然后从该子查询中进行选择。

但是我的代码有错误; “ORA-00923: FROM 关键字未在预期位置找到”。

我的代码如下:

select *
from (
   select *,
          row_number() over (partition by DIS_COL order by COL_2) as row_number --ORDER BY FIELD DETERMINES WHICH ROW IS THE FIRST ROW AND THUS WHICH ONE IS SELECTED.
   from MY_TABLE
   ) as rows
where row_number = 1
AND CRITERIA_COL = 'CRIT_1'
OR CRITERIA_COL_2 = 'CRIT_2';

如何更正我的代码以达到预期的效果?

我正在开发一个 Oracle 数据库。

【问题讨论】:

    标签: oracle


    【解决方案1】:

    删除as rows。表/查询别名的语法不正确。它是列别名的语法。

    select *
    from (
       select T.*, 
              row_number() over (partition by DIS_COL order by COL_2) as row_number --ORDER BY FIELD DETERMINES WHICH ROW IS THE FIRST ROW AND THUS WHICH ONE IS SELECTED.
       from MY_TABLE t
       ) 
    where row_number = 1
    AND (CRITERIA_COL = 'CRIT_1'
    OR CRITERIA_COL_2 = 'CRIT_2');
    

    【讨论】:

      【解决方案2】:

      不是ROW_NUMBER,是*,给子查询添加别名:

      select *
      from (
         select T.*, -- here
                row_number() over (partition by DIS_COL order by COL_2) as row_number --ORDER BY FIELD DETERMINES WHICH ROW IS THE FIRST ROW AND THUS WHICH ONE IS SELECTED.
         from MY_TABLE
         )T as rows -- and here
      where row_number = 1
      AND CRITERIA_COL = 'CRIT_1'
      OR CRITERIA_COL_2 = 'CRIT_2';
      

      【讨论】:

      • 谢谢,这是有道理的。不幸的是,我现在在“as rows”中的“as”上收到“sql command not properly ending”错误。不知道为什么。我已经尝试明确命名子查询中的所有列(例如 T. DIS_COL),但这不起作用。你知道我错过了什么吗?
      • 我不确定 Oracle 中的“显式命名”是什么(我在 google 中没有找到),您能否提供更多有关您要完成的工作的信息?因为如果您只是运行查询,则根本不需要“作为行”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 2018-01-19
      相关资源
      最近更新 更多