Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.9.1 LIMIT句の指定形式および規則

LIMIT句には,問合せ式または問合せ式本体の検索結果として取得する行数の上限を指定します。

LIMIT句は次の個所に指定できます。

注※

表副問合せによる導出表に限ります。「7.9.1 LIMIT句の指定形式および規則」中で表記されている導出表は,表副問合せによる導出表のことです。

〈この項の構成〉

(1) 指定形式

SELECT文の最も外側の問合せ指定または問合せ式本体にLIMIT句を指定する場合
LIMIT句::=LIMIT 〔オフセット行数,〕リミット行数
 
  オフセット行数::=値指定
  リミット行数::=値指定
■導出表,スカラ副問合せ,WITH句,またはCREATE VIEW文にLIMIT句を指定する場合
LIMIT句::=LIMIT リミット行数
 
  リミット行数::=値指定

(2) 指定形式の説明

オフセット行数

問合せ式の検索結果のうち,先頭行から読み飛ばす行数を指定します。例えば,「LIMIT 10,5」と指定した場合(オフセット行数10リミット行数5),問合せ式の検索結果の最初の10行が読み飛ばされ,11行目〜15行目が取得されます。

指定規則を次に示します。

  • オフセット行数は,SELECT文の最も外側の問合せ指定または問合せ式本体に指定するLIMIT句にだけ指定できます。導出表,スカラ副問合せ,WITH句,またはCREATE VIEW文に指定するLIMIT句には,オフセット行数を指定することはできません。

  • オフセット行数は,値指定の形式で指定します。値指定については,「7.21 値指定」を参照してください。

  • オフセット行数には,02,147,483,647の整数(INTEGER型のデータ)を指定してください。

  • オフセット行数0を指定した場合,オフセット行数の指定がないときと同様に,問合せ式の検索結果の先頭行から,リミット行数に指定した行数が取得されます。

  • オフセット行数に?パラメタを指定した場合,?パラメタに仮定されるデータ型はINTEGER型になります。

  • オフセット行数にナル値は指定できません。

リミット行数

問合せ式または問合せ式本体の検索結果から取得する行数の最大値を指定します。

指定規則を次に示します。

  • リミット行数は,値指定の形式で指定します。値指定については,「7.21 値指定」を参照してください。

  • リミット行数には,0〜2,147,483,647の整数(INTEGER型のデータ)を指定してください。

  • リミット行数0を指定した場合,検索結果は0行となります。

  • リミット行数に?パラメタを指定した場合,?パラメタに仮定されるデータ型はINTEGER型になります。

  • リミット行数にナル値は指定できません。

(3) 規則

(a) SELECT文の最も外側の問合せ指定または問合せ式本体にLIMIT句を指定する場合の規則

  1. LIMIT句を指定した場合,問合せ式の検索結果の行数は次のようになります。

    MAX{ MIN(LIMIT句を指定しない場合の問合せ式の検索結果の行数オフセット行数リミット行数),0 }

  2. 問合せ式の検索結果の行数が,オフセット行数およびリミット行数を超えた場合,次のケースでは検索結果が一意に定まりません。

    • ORDER BY句の指定がない場合

    • ORDER BY句の指定はあるが,LIMIT句によって取得される結果の最終行のソートキーの値と同じ値を持つ行がほかにもある場合(例1を参照)

    • ORDER BY句の指定はあるが,オフセット行数の指定によって読み飛ばされた最終行のソートキーの値と同じ値を持つ行がほかにもある場合(例2を参照)

(例1)

リミット行数2を指定して,次のSELECT文を実行して販売履歴表(SALESLIST)を検索します。

SELECT "USERID","PUR-CODE","PUR-NUM"
    FROM "SALESLIST"
       ORDER BY "PUR-NUM" ASC
       LIMIT 2

[図データ]

[説明]
  • ORDER BY句の指定によって,PUR-NUM列の値をソートキーとして,問合せ式の結果を昇順に並べます。

  • リミット行数の指定によって,最初の2行が検索結果として取得されます。

  • 最終行(2行目)のソートキーの値(3)が同じである行が2つあるため,検索結果が不定になります。

(例2)

オフセット行数2リミット行数1を指定して,次のSELECT文を実行して販売履歴表(SALESLIST)を検索します。

SELECT "USERID","PUR-CODE","PUR-NUM"
    FROM "SALESLIST"
       ORDER BY "PUR-NUM" ASC
       LIMIT 2,1

[図データ]

[説明]
  • ORDER BY句の指定によって,PUR-NUM列の値をソートキーとして,問合せ式の結果を昇順に並べます。

  • オフセット行数の指定によって,最初の2行が読み飛ばされます。

  • 読み飛ばされた最終行(2行目)のソートキーの値(3)が同じである行が2つあるため,読み飛ばされる行によって検索結果が変わります。

(b) 導出表,スカラ副問合せ,WITH句,またはCREATE VIEW文にLIMIT句を指定する場合の規則

  1. 次の導出表にはLIMIT句を指定できません。

    • LIMIT句を指定した導出表を超えて,外への参照を行っている導出表

      (例)エラーになるSQL文の例

      [図データ]

      この場合,"T1"."C1"が,LIMIT句を指定した導出表(相関名:DRV)を超えて外への参照を行っています。そのため,LIMIT句を指定することはできません。

      導出表については,「7.11.1 表参照の指定形式」を参照してください。

  2. LIMIT句を指定した場合,問合せ式本体の結果行数は次のようになります。

    MIN(LIMIT句を指定しない場合の問合せ式本体の結果行数リミット行数

  3. 問合せ式本体の結果行数がリミット行数を超えた場合,次のケースでは検索結果が一意に定まりません。

    • 導出表,スカラ副問合せ,またはWITH句にLIMIT句を指定した場合(これらの指定にはORDER BY句を指定できないため)

    • LIMIT句を指定したCREATE VIEW文で定義したビュー表を検索した場合(CREATE VIEW文にはORDER BY句を指定できないため)

    (例)

    CREATE VIEW "SALESLIST_VIEW" AS SELECT * FROM "SALESLIST" LIMIT 2
    SELECT * FROM "SALESLIST_VIEW" ORDER BY "USERID"

    上記のSELECT文を実行した場合,検索結果は次のように一意に定まりません。

    [図データ]

    上記では検索結果を2例だけ説明していますが,上記以外の検索結果も表示されることがあります。

  4. 外側の問合せの列を参照している問合せ式本体にLIMIT句を指定した場合,その問合せ式本体の結果の全体行数は,LIMIT句の対象になりません。この場合,外側の問合せの列の1つの値に対する問合せ式本体の結果の行数が,LIMIT句の対象になります。

    (例)

    SELECT (SELECT "PRODUCTLIST"."PUR-NAME" FROM "PRODUCTLIST"
              WHERE "SALESLIST"."PUR-CODE"="PRODUCTLIST"."PUR-CODE" LIMIT 1)
           ,"SALESLIST"."PUR-NUM"
        FROM "SALESLIST"

    上記の例の場合,下線部分の"SALESLIST"."PUR-CODE"が,外側の問合せの列を参照しています。

    上記のSELECT文を実行した場合,検索結果は次のようになります。

    [図データ]

(4) 例題

例題1(問合せ指定にLIMIT句を指定した例)

支店表(BRANCHESLIST)から,売上高(SALES)上位10位の支店を検索します。

SELECT "BRANCH-CODE","RGN-CODE","BRANCH-NAME","SALES"
    FROM "BRANCHESLIST"
    ORDER BY "SALES" DESC
    LIMIT 10

下線部分がLIMIT句の指定です。

例題2(オフセット行数を指定した例)

支店表(BRANCHESLIST)から,売上高(SALES)21位〜30位の支店を検索します。

SELECT "BRANCH-CODE","RGN-CODE","BRANCH-NAME","SALES"
    FROM "BRANCHESLIST"
    ORDER BY "SALES" DESC
    LIMIT 20,10

下線部分がLIMIT句の指定です。

例題3(導出表にLIMIT句を指定した例)

販売履歴表(SALESLIST)から任意の100行を取得し,その取得結果に対して商品コード(PUR-CODE)ごとに,販売個数(PUR-NUM)の合計値を求めます。

SELECT "PUR-CODE",SUM("PUR-NUM")
    FROM (SELECT * FROM "SALESLIST" LIMIT 100) "SALESLIST"
        GROUP BY "PUR-CODE"

下線部分がLIMIT句の指定です。

上記のSELECT文は,販売履歴表(SALESLIST)から任意の100行を取得し,検索結果を求めています。任意の100行は検索のたびに変わることがあるため,上記のSELECT文の結果は検索のたびに変わることがあります。

例題4(導出表にLIMIT句を指定した例)

販売履歴表(SALESLIST)の購入日(PUR-DATE)に条件を指定して,検索結果行数を求めます。LIMIT句を指定して,導出表の行数が1,000を超えた時点で検索を終了し,検索結果を返します。

SELECT COUNT(*)
  FROM (SELECT 1 FROM "SALESLIST"
        WHERE "PUR-DATE" BETWEEN ? AND ? LIMIT 1000) "SALESLIST"("PUR-DATE")

下線部分がLIMIT句の指定です。

導出表にLIMIT句を指定することによって(導出表の行数の上限を決めることによって),SELECT文の実行時間を一定時間内に抑えることができます。検索結果が1,000行未満になるまで絞り込むような場合に,上記のSELECT文を実行します。上記のSELECT文を実行した結果,検索結果が1,000の場合は検索条件を満たす行が1,000行以上あります。この場合,検索結果が1,000未満になるまで,?パラメタの値を変えてSELECT文を繰り返し実行します。

例題5(スカラ副問合せにLIMIT句を指定した例)

販売履歴表(SALESLIST)から,販売個数(PUR-NUM)が最も多い日の購入日(PUR-DATE)と商品コード(PUR-CODE)を求めます。

SELECT DISTINCT "PUR-DATE","PUR-CODE"
  FROM "SALESLIST"
    WHERE "PUR-DATE"=(SELECT "PUR-DATE" FROM "SALESLIST"
                        WHERE "PUR-NUM"=(SELECT MAX("PUR-NUM")
                                           FROM "SALESLIST") LIMIT 1)

下線部分がLIMIT句の指定です。

販売個数(PUR-NUM)が最も多い日が複数ある場合,そのうちの任意の購入日(PUR-DATE)が検索対象になるため,上記のSELECT文の結果は検索のたびに変わることがあります。