我有一个针对Oracle数据库的规范top-N查询,这是所有常见问题解答和Howto建议的:
select ... from (
select ... from ... order by ...
) where ronwum <= N
它在Oracle 11上运行良好,即它按内部选择中指定的顺序返回前N个记录。
然而,它在Oracle 12上中断。它仍然返回相同的前N个记录,但它们可能会被洗牌。这些记录的最终顺序是不确定的。
我在谷歌上搜索了一下,但没有找到任何相关的讨论。看起来其他人总是从这样的选择中获得正确的记录顺序。
不过有一个发现很有趣。我看到一些人(不幸的是,没有解释)在外部选择中使用了一个额外的按rownum排序子句:
select ... from (
select ... from ... order by ...
) where ronwum <= N
order by rownum
(这里的两个rownum都是对Oracle伪列的引用;它不是内部选择返回的东西)
它似乎有效。但使用Oracle optimizer,你永远无法确定这是运气好还是一个真正正确的解决方案。
问题是:在这种情况下,通过rownum
订购是否保证正确订购,为什么?我和我的同事无法就此达成一致。
P、 我知道选择前N个记录的其他方法,例如使用row_数分析函数和Oracle 12中引入的fetch first子句。我也知道我可以按顺序重复相同的内容 在外部选择。问题只在于按rownum排序-是否正确。
内部查询和外部查询可能会也可能不会给出不同的顺序,因此rownum的顺序不同。由于rownum已经排序,如果您想获得前N条记录,那么最好的做法是在内部查询中创建rownum的别名并将其用于外部查询。
选择... from(选择rowna rn... from...)其中rn
问题内容: 我正在尝试编写一个函数,该函数将测试列表是否按降序排列。到目前为止,这是我所拥有的,但似乎不适用于所有列表。 我使用了列表,它返回了。 我似乎无法弄清楚我的错误在哪里。 问题答案: 您宁可进行反向检查(一旦获得,则返回false
我有一个sql查询 所以我显然想按价格从高到低来订购。然而,它似乎是取第一个数字并按其排序。我的理论是,它将它视为字符串,由于列是varchar,这是有意义的。然而,这是第三方数据,所以我被它卡住了。我怎样才能订购,使较大的数字在前? 这是一个如何排序的例子
我正在将一个项目从Oracle迁移到PG,并且遇到一个sql查询问题。 这是我的桌子: 这是我正在迁移的原始oracle查询: 这是我的postgresql查询: 我从这里得到的同级排序解决方案https://stackoverflow.com/a/17737560/5182503 . 然而,postgresql结果集中的行顺序不同于oracle结果集中的行顺序。那rownum呢?我完全停下来了。
问题内容: 我认为使用某种顺序才有意义。我想做的是在视图中包括该子句,以便该视图上的所有s都可以忽略它。但是,我担心该订单不一定会延续到,因为它没有指定订单。 是否存在一种情况,即视图指定的顺序不会反映在该视图上的select结果中(该视图中的order by子句除外)? 问题答案: 您不能指望没有显式子句的任何查询中的行顺序。如果查询有序视图,但没有包括子句,则如果它们的顺序正确,请感到惊喜,并
Oracle的ROWNUM应用于ORDER BY之前。为了根据排序列放置ROWNUM,在所有文档和文本中提出了以下子查询。 这让我讨厌。据我所知,从输入到的表是关系型的,因此没有存储顺序,这意味着当从看到时,子查询中的顺序不受尊重。 我不记得确切的场景,但“在外部查询中没有影响”这一事实我已经阅读了不止一次。示例是内联子查询、的子查询、PARTITION子句的等。例如在 在外部查询中不会尊重工资顺
问题内容: 有没有一种方法可以在SQL中进行合并和合并,以便在该列不为null时可以按列排序,但如果为null,则可以由另一列来排序? 问题答案: 就像是: 与写作相同: 两者都可以在任何理智的RDBMS中使用。