• 締切済み

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;

  • Oracle
  • 回答数1
  • ありがとう数0

みんなの回答

  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.1

TEST_TBLにはどんなレコードが格納されていますか?各バージョン環境で完全に同一だったでしょうか?それが分からないとなんとも言えませんが、 このSQLですと、BETWEENに何を指定してもTEST_TBLのレコード件数=ALLCNTになるとしか思えないのです。 T2に対する絞込みは、1つ目のSQLのWITH内の問い合わせや2つ目のSQLのT1内の副問い合わせと直接関係がないからです。

関連するQ&A

  • oracleでwith句の結果を使ってupdate

    oracleでwith句の結果を使って外部結合?でupdateしたいのですが 上手くいきません。 oracleでは無理なのでしょうか。 よろしくお願いいたします、。 /*---------- with v1 as ( select row_number() over(PARTITION BY ・・・ ORDER BY ・・・) as rnum ,no ,col1 ,・・・ from ・・・ ) update ( select A.col1 A_COL, v1.col2 B_COL from table1 A inner join table2 B on A.cd1=B.cd1 inner join v1 on A.no=v1.no where v1.rnum=1 and ・・・ ) set A_COL=B_COL ; ----------*/ と書いたのですが、 実際に実行してみると、 カッコ「(」、「)」がないとか、 selectが必要とか, A_COLやB_COLが無効ですとか、 となります。 どこが悪いのでしょうか。 oracleではupdateでwithは使えないのでしょうか。 よろしくお願いします。

  • シンプルなSQLの書き方がわかりません。

    以下のSQLをシンプルに一つにしたいのですが、どのように書いたらよろしいでしょうか? どうぞご返答頂けますようお願い申し上げます。 --test1_tblの抽出 select a1 as a1, b1 as b1 from a_tbl where c=1 --test2_tblの抽出 select a1 as a1, e1 as e1 from b_tbl where rowid in (select min(rowid) from ee group by a1) and a1 is not null and a1 !=' ' order by a1 --test1_tblとtest2tblの結合 select t0.a1 as a1, t0.b1 as b1, t1.e1 as e1 FROM test1_tbl t0, test2_tbl t1 WHERE (t0.a1 = t1.a1)

  • ROW_NUMBER()を使用したデータ取得

    ROW_NUMBER()を使用してORDERした結果の5行目から10行目を 取得したい場合、どこのサイトを参照しても下記(1)のように NOで並び替えたデータをインラインビューとして WHERE RNUM BETWEEN 5 AND 10 と条件を絞っていますが、(2)のように直接条件を指定した場合と どのような違いがあるのか教えてください。 (1) SELECT NO, NAME FROM ( SELECT NO, NAME, ROW_NUMBER() OVER (ORDER BY NO) RNUM FROM ROWNUM_TEST ) WHERE RNUM BETWEEN 5 AND 10 (2) SELECT NO, NAME,ROW_NUMBER() OVER (ORDER BY NO) RNUM FROM ROWNUM_TEST WHERE RNUM BETWEEN 5 AND 10

  • 複数の検索結果をSELECT条件にしたい

    SELECT KANRI_NO ,EDA_NO ,NO_S ,NO_E FROM KANRI_TBL WHERE KANRI_NO='1' ORDER BY EDA_NO; の検索結果が、 KANRI_NO ,EDA_NO ,NO_S ,NO_E 1 , 1 , 1 , 10 1 , 2 , 52 , 60 1 , 3 , 90 , 99 のような結果をVBで、 SELECT  * FROM SYOSAI_TBL WHERE BETWEEN 1 AND 10 BETWEEN 52 AND 60 BETWEEN 90 AND 99; のような形の編集しています。 これをひとつのSQL分では書けないのでしょうか? 教えてください

  • SQL ORDER BY句に別名を指定

    SQL初心者です。 よろしくお願い致します。 Oracle SQLのORDER BY句で日本語の別名と英字の別名とでは処理速度が変わるのでしょうか。 例えば、給与から控除額を引いて税抜き給与支給額の多い順に並べたい場合に 以下のようなSQLを検討しました。 ORDER BY句にはSELECT内の計算結果の別名を指定しました。 その結果、処理が遅くなる感じがしました。 代わりに、"税抜き給与支給額"をSIKYU_GAKと英字にすると早くなった気がしました。 日本語の別名と英字の別名とでは処理速度が異なるものでしょうか。 SELECT t1.ID AS "社員ID" ,t1.NAME AS "社員名" ,t1.KYUYO AS "給与" ,t1.ZEI AS "税金" ,t1.OTHER AS "その他" ,(t1.KYOYO - t1.ZEI - t1.OTHER) AS "税抜き給与支給額" FROM 社員 t1 ORDER BY "税抜き給与支給額"

  • SQL構文

    MASTER_TBLを、CDとKAKU_CDの2列で一意をなるようにしたいので、重複データを洗い出すためのSQLを組もうとしています。 FROM句のサブクエリ単体では、正常な結果が取得できるのですが、下のSQLを流すと、全データ件数×全データ件数が結果として返ってきます。 重複行のみを表示するにはどうすればいいのでしょうか?単純な構文ミスのような気がするのですが、、、 SELECT  M1.CD AS CD1,  M1.KAKU_CD AS KAKU_CD1,  M1.UPDATE_DATE AS UPDATE_DATE1 FROM  MASTER_TBL M1,  (   SELECT M2.CD || M2.KAKU_CD AS CODE2, COUNT(*)   FROM MASTER_TBL M2   GROUP BY M2.CD, M2.KAKU_CD   HAVING COUNT(*) > 1  ) SUB_T; WHERE M1.CD || M1.KAKU_CD IN ( CODE2 ) ORDER BY 1, 2, 3 ;

  • accessでDISTINCT 句と矛盾

    IIFで置き換えをした結果をソートしようとしましたが、 SELECT DISTINCT a,IIF(IsNull(b), 0, 1) AS c FROM shain ORDER BY a,c [Microsoft][ODBC Microsoft Access Driver] ORDER BY 句 (c) が DISTINCT 句と矛盾しています。 というエラーになりました。 正しいSQLを教えてください。 SELECT DISTINCT a,IIF(IsNull(b), 0, 1) AS c FROM shain ORDER BY a,b も試しましたが同じようにエラーになりました。

  • 「SELECT ~  FROM テーブル名」の後に続く句は「WHERE句」と「ORDER BY句」以外にありますか?

    最近アクセスのSQL文を学びました。 選択クエリのSQL文で 「SELECT ~  FROM テーブル名」 の後に続く句は 「WHERE句」と 「ORDER BY句」以外にありますか? よろしくお願いします。

  • Access、SQLステートメントでの仮テーブルの作り方について

    AccessのSQLステートメントで仮テーブルを使ったSQLを作りたいのですが、構文の書き方がよくわかりません。 わからないなりに以下のようなSQL文を作ってみたのですが、 SELECT TBL.NO FROM [SELECT NO FROM ○○TBL WHERE △△="△△" GROUP BY NO HAVING (Mid(××,2,1)="K") ]. AS TBL; (本当はWHEREのあとにANDがたくさんあります) 実行すると、 「パラメータや別名が正しいこと、無効な文字や区切り記号が含まれていないこと、または名前が長すぎないことを確認してください。」 とメッセージが出ます。 仮テーブルに長いSELECT文をつかうことはできないのでしょうか? ちなみに環境はOS:Win2000+Access2000です。 どなたかアドバイスください。 よろしくお願いします。

  • JOIN句への変換

    はじめまして。 「*=」をJoin句に直したいのですが、同様の結果がえられません(T.T) SQL初心者です、どうぞよろしくお願いいたします。 この式をJOIN句に直したいです。 FROM A_TBL, B_TBL as B_TBL01, B_TBL as B_TBL02, C_TBL, D_TBL WHERE A_TBL.No = B_TBL01.No AND A_TBL.No = B_TBL02.No AND A_TBL.No = C_TBL.No AND A_TBL.No *= D_TBL.No AND C_TBL.ID *= D_TBL.ID AND ↓こうしたのですが、正しい結果がえられません。 FROM (D_TBL RIGHT OUTER JOIN C_TBL ON C_TBL.ID = D_TBL.ID) RIGHT OUTER JOIN A_TBL INNER JOIN B_TBL AS B_TBL01 ON A_TBL.No = B_TBL01.No1.No INNER JOIN B_TBL AS B_TBL02 ON A_TBL.No = B_TBL02.No2.No ON A_TBL.No = D_TBL.No AND A_TBL.No = C_TBL.No どうぞ、ご教授お願いいたします。