我的代码是:
with x as
(
select 1 col from dual union all
select 2 col from dual union all
select 8 col from dual union all
select 4 col from dual union all
select 3 col from dual union all
select 2 col from dual
)
select col col1, col col2, col col3, rownum
from x
where col2.ROWNUM > col1.ROWNUM -1
and col2.ROWNUM > col3ROWNUM +1 ;
我想比较col2.ROWNUM > col1.ROWNUM -1 and col2.ROWNUM > col3ROWNUM + 1
,但这不起作用,并且出现错误
ORA-01747:用户、表、列、表、列或列说明无效
01747. 00000-"无效的用户.表.列,表.列,或列说明"
- 原因:
- 行动:
行错误:10色谱柱:13
请帮帮我
4条答案
按热度按时间deyfvvtc1#
你好像出了点问题。
该CTE的结果是一个单列 * 表 *,其中只有一列名为
col
,没有其他列。因此,您编写的
where
子句没有任何意义,也许您应该解释一下您真正拥有的是什么,应该应用于源数据的规则以及您希望得到的结果。根据您放入标题中的文本:
比较前一行中的前一列与下一行中的下一列
也许您会对
lag
和lead
分析函数感兴趣,这些函数允许您 * 比较 * 相邻行中的值(注意NULL
值;我没有)。例如:结果:
6tdlim6h2#
使用lead或lag函数。但是,请不要将rownum用于此类目的。Rownum仅指示在数据库中找到行的顺序,除了限制获取的行数外,不能用于其他目的,例如,当rownum〈=1时,可以确保不会出现too_many_rows异常。尽管如此,如果在查询中获取伪列rownum,给予它一个别名,以便以后可以使用该值。此外,col2.ROWNUM或col1.ROWNUM应该是什么意思?这一点并不清楚。col 1和col 2是两列,它们没有属性rownum。以下内容可能对将来的分析查询有所帮助:https://oracle-base.com/articles/misc/lag-lead-analytic-functions
而且,如果你希望得到一个工作的SQL,请清楚地解释你希望实现什么,因为我还没有真正理解代码的目的是什么。
使用rownum而不会出错的一种方法:
,x2 as(select col col 1,col col 2,col col 3,rownum rn from x)select * from x2其中rn在2和3之间--- rownum不能用于这样的条件!!!;
或者,为了确保只从满足给定条件的表中获取第一行:
pb3skfrl3#
在Oracle中,除非使用
ORDER BY
子句,否则结果集具有不确定的顺序(即,它们是无序的)。因此,如果您有物理表,则需要另一列来提供顺序(而不是依赖ROWNUM
伪列,后者可能会导致意外行为):如果您想找到连续向上的行,那么可以使用
MATCH_RECOGNIZE
进行逐行模式匹配:或
LEAD
解析函数:两者都输出:
| COL1|COL2|COL3|开始订单ID|
| - ------|- ------|- ------|- ------|
| 1个|第二章|八个|1个|
fiddle
2j4z5cfb4#
看起来您想查找列值大于上一行和下一行的值的行。如果是这样,您可以尝试以下操作:
...使用稍有不同的样本数据,这将找到满足条件的其他行...
或没有ID -使用ROWNUM(如您的问题),-不建议,尽管...
添加到查询中的任何Order By子句都可能更改ROWNUM值和结果...