質問

通常、ある範囲のテーブルからデータを取得する必要があります。たとえば、検索結果ごとに個別のページがあります。 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

しかし、私はそれが悪いスタイルであることを知っています。では、最高のパフォーマンスを得るためにクエリを実行するにはどうすればいいですか?

役に立ちましたか?

解決

私の要件はすでにDB2 9.7.2に追加されています。

DB2 9.7.2は、以下に示すように、クエリ結果を制限するための新しい構文を追加します。

SELECT * FROM TABLE LIMIT 5 OFFSET 20

データベースは行番号から結果を取得します。 21-25

他のヒント

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を設定すると、このクエリのパフォーマンスが向上します。

それは非常に難しく、どのデータベースを持っているかによります。

例:

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top