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 に答える