WITH句を使用したSQLの結果
WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、
WITH TMP AS
(SELECT
ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME
FROM
TEST_TBL
ORDER BY NO)
SELECT
T1.ALLCNT,
T2.*
FROM
(SELECT
COUNT(*) ALLCNT
FROM
TMP) T1,
TMP T2
WHERE
T2.CHECKROWNUM BETWEEN 1 AND 20;
Oracle10.2.0.3.0のバージョンで
ALLCNTが21になってしまう現象が発生してしまいました。
Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、
バージョンによる不具合は考えられますでしょうか。
それともSQL自体なにか悪い部分があるのでしょうか。
ちなみに
T2.CHECKROWNUM BETWEEN 1 AND 100;
と帰るとALLCNTが101と帰ってきます。
また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに
置き換えると正しくALLCNTが取れます。
SELECT
T1.ALLCNT,
T2.*
FROM
(SELECT
COUNT(*) ALLCNT
FROM
(SELECT
ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME
FROM
TEST_TBL
ORDER BY NO)) T1,
(SELECT
ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME
FROM
TEST_TBL
ORDER BY NO) T2
WHERE
T2.CHECKROWNUM BETWEEN 1 AND 20;
お礼
回答ありがとうございます。 投稿前に以下のサイトを見て空行は削除しました。 →http://shogizuki.com/nextstep/2009/09/sqlplusora00928.html 僕自身with句の使い方をよく知らなかったのでもう一度 使い方を確認してみると with テーブル名1 as ( セレクト文 ), テーブル名2 as ( セレクト文 ) SELECT テーブル名1.取得カラム, テーブル名2.取得カラム FROM テーブル名1, テーブル名1 ↑↑↑二つ目のwith句の前にカンマを入れ忘れていました。 これで「ora-00928」関する問題は解決?したようです。 すると、「ora-00905」なるエラーが表示されました。 調べてみるとSQLの構文エラーらしいです。 少し調べてわからなくなったらまた質問します。 回答ありがとうございました!