7

通常,我需要从某个范围内的表中检索数据;例如,每个搜索结果都有一个单独的页面。在 MySQL 中我使用 LIMIT 关键字,但在 DB2 中我不知道。现在我使用这个查询来检索数据范围。

SELECT * 
FROM(
   SELECT  
      SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO
      , DATA_KEY_VALUE
      , SHOW_PRIORITY
   FROM 
      EMPLOYEE
   WHERE 
      NAME LIKE 'DEL%'
   ORDER BY
      NAME DESC
   FETCH FIRST 20 ROWS ONLY
) AS TMP
ORDER BY 
  TMP.RUNNING_NO ASC
FETCH FIRST 10 ROWS ONLY

但我知道这是不好的风格。那么,如何查询最高性能呢?

4

4 回答 4

8

我的需求已经添加到 DB2 9.7.2 中。

DB2 9.7.2 为限制查询结果添加了新语法,如下图所示:

SELECT * FROM TABLE LIMIT 5 OFFSET 20

数据库将从第号行检索结果。21 - 25

于 2010-06-13T18:12:46.417 回答
3

不确定为什么要创建 TMP 表。RUNNING_NO 不是按升序排列吗?我会认为:

SELECT SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO,
       DATA_KEY_VALUE,
       SHOW_PRIORITY
  FROM EMPLOYEE
 WHERE NAME LIKE 'DEL%'
 ORDER BY NAME DESC
 FETCH FIRST 10 ROWS ONLY

会给出相同的结果。

在 EMPLOYEE 表上对 NAME 使用 INDEX 将提高此查询的性能。

于 2008-11-07T18:34:42.547 回答
3

这非常困难,这取决于您拥有哪个数据库。

例如:

SELECT * FROM ( 
    SELECT 
      ROW_NUMBER() OVER (ORDER BY ID_USER ASC) AS ROWNUM,  
      ID_EMPLOYEE, FIRSTNAME, LASTNAME 
    FROM EMPLOYEE 
    WHERE FIRSTNAME LIKE 'DEL%' 
  )  AS A WHERE A.rownum
BETWEEN 1 AND 25
于 2011-01-04T09:18:11.843 回答
0

很简单,只需按照语法进行分页即可。

LIMIT (pageSize) OFFSET ((currentPage) * (pageSize))
于 2019-11-14T17:26:44.273 回答