gpt4 book ai didi

sql - 为什么=运算符除了值1之外不能与ROWNUM一起使用?

转载 作者:行者123 更新时间:2023-12-04 05:14:13 26 4
gpt4 key购买 nike

我有以下查询:

select * from abc where rownum = 10

输出:无要显示的记录

我确定abc表中有25条以上的记录,而我的目标是显示第n条记录。

如果我将查询写为:-
select * from abc where rownum = 1

它工作正常,并给了我第一张唱片。除了第一,没有其他记录。

任何想法?

最佳答案

因为行号是顺序分配给获取和返回的行的。

这就是您的陈述的运作方式。它获取第一条候选行,并临时为其赋予行号1,该行与您的条件不匹配,因此被丢弃。

然后,您将获得第二个候选行,并且它的行号也为1(因为前一个被扔掉了)。它也不匹配。

然后是第三个候选行...好吧,我敢肯定,您可以看到现在的情况。简而言之,您将永远找不到满足该条件的行。

行号仅对= 1< something<= something有用。

所有这些都在Oracle docs for the rownum pseudo-column中进行了说明。

您还应该记住,SQL是一个关系代数,除非您指定顺序,否则它会返回无序集。这意味着第10行现在可能会有所变化,而三分钟后可能会有所变化。

如果您想要(麻烦的)方法来获取n行,则可以使用类似(第五行)的方法:

select * from (
select * from (
select col1, col2, col3 from tbl order by col1 asc
) where rownum < 6 order by col1 desc
) where rownum = 1

内部选择将确保您在开始丢弃行之前在查询上具有一致的顺序,中间选择将丢弃该行中除前五行之外的所有行,并颠倒顺序。

然后,外部选择将仅返回反转集的第一行(按升序排列时,这是五行集的最后一行)。

更好的方法可能是:
select * from (
select rownum rn, col1, col2, col3 from tbl order by col1
) where rn = 5

通过检索所有内容并将rownum分配给“真实”列,然后使用该真实列号来过滤结果,可以进行此操作。

关于sql - 为什么=运算符除了值1之外不能与ROWNUM一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9679051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com