gpt4 book ai didi

oracle - oracle中rownum之谜

转载 作者:行者123 更新时间:2023-12-02 07:04:09 25 4
gpt4 key购买 nike

我正在努力获取基于 rownum 的数据。当我执行下面的查询来获取基于 rownum 1 to 4 的结果时,它工作正常。

  SELECT ROWNUM TOTAL,MI.* FROM (SELECT USER_ID,CUSTOMER_NAME FROM ELEC_AUTO_MERC 
ORDER BY CREATION_DATE DESC ) MI WHERE ROWNUM BETWEEN 1 AND 4;

但是当我执行相同的查询以从 rownum 2 到 4 获取结果时,它不起作用,它不会返回任何内容。

  SELECT ROWNUM TOTAL,MI.* FROM (SELECT USER_ID,CUSTOMER_NAME FROM ELEC_AUTO_MERC 
ORDER BY CREATION_DATE DESC ) MI WHERE ROWNUM BETWEEN 2 AND 4;

作为一种解决方法,当我再使用一个 SELECT 语句时,它工作正常,但我认为仅对 rownum 多次使用 SELECT 并不是一个好方法。

SELECT * FROM (SELECT ROWNUM TOTAL,MI.* FROM (SELECT USER_ID,CUSTOMER_NAME FROM ELEC_AUTO_MERC 
ORDER BY CREATION_DATE DESC ) MI) WHERE TOTAL BETWEEN 2 AND 4;

你能帮我创建优化查询吗?

最佳答案

ROWNUM 很奇怪,因为它可以作为查询中条件的一部分进行评估 - 但如果该行无法通过该过滤器,则 ROWNUM 值它被分配的内容可以再次用于下一行。

这样做的一个重要影响是,如果您使用任何排除 ROWNUM 值 1 的条件,您将永远不会获得匹配项。针对此条件进行测试的第一行将是第 1 行;但随后它将无法通过测试,因此下一行将被视为第 1 行;等等。

所以你的条件ROWNUM BETWEEN 2 AND 4永远不可能为真。

您找到的解决方法是传统的解决方法。另一种方法是使用分析函数对行进行排名,然后根据排名进行过滤,例如:

SELECT MI.* FROM (
SELECT USER_ID,CUSTOMER_NAME, RANK() OVER (ORDER BY CREATION_DATE DESC) AS the_rank
FROM ELEC_AUTO_MERC
) MI
WHERE the_rank BETWEEN 2 AND 4;

多个分析函数 - RANK、DENSE_RANK 和 ROW_NUMBER - 可用于此目的,并且会产生略有不同的结果,特别是在存在平局的情况下。查看文档。

关于oracle - oracle中rownum之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32959404/

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