gpt4 book ai didi

sql - rownum/获取前n行

转载 作者:行者123 更新时间:2023-12-02 03:43:46 24 4
gpt4 key购买 nike

select * from Schem.Customer 
where cust='20' and cust_id >= '890127'
and rownum between 1 and 2 order by cust, cust_id;

执行时间大约 2 分 10 秒

   select * from Schem.Customer where cust='20' 
and cust_id >= '890127'
order by cust, cust_id fetch first 2 rows only ;

执行时间大约 00.069 毫秒

执行时间差别很大,但结果是一样的。我的团队没有采用后来的一个。不要问为什么。

那么 Rownum 和 fetch first 2 rows 之间有什么区别,我应该怎么做才能改进或说服任何人采用。

数据库管理系统:DB2 LUW

最佳答案

虽然两个 SQL 最终都给出了相同的结果集,但它只发生在您的数据上。结果集很可能会有所不同。让我解释一下原因。

我将使您的 SQL 更简单一些,使其易于理解:

SELECT * FROM customer
WHERE ROWNUM BETWEEN 1 AND 2;

在此 SQL 中,您只需要第一行和第二行。没关系。 DB2 将优化您的查询并且永远不会查看第二行以外的行。因为只有前 2 行符合您的查询。

然后添加 ORDER BY 子句:

SELECT * FROM customer
WHERE ROWNUM BETWEEN 1 AND 2;
ORDER BY cust, cust_id;

在这种情况下,DB2 首先获取 2 行,然后按 cust 和 cust_id 对它们进行排序。然后发送给客户(你)。到目前为止,一切都很好。但是,如果您想先按 cust 和 cust_id 排序,然后再询问前 2 行怎么办?它们之间有很大的区别。

这是针对这种情况的简化 SQL:

SELECT * FROM customer
ORDER BY cust, cust_id
FETCH FIRST 2 ROWS ONLY;

在此 SQL 中,所有行都符合查询条件,因此 DB2 获取所有行,然后对它们进行排序,然后将前 2 行发送到客户端。

在您的例子中,两个查询给出相同的结果,因为前两行已经按 cust 和 cust_id 排序。但是,如果前 2 行具有不同的 cust 和 cust_id 值,它将不起作用。

关于此的提示是 FETCH FIRST n ROWS 出现在 order by 之后,这意味着 DB2 对结果排序然后检索前 n 行。

关于sql - rownum/获取前n行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47520732/

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