SQL> select QUESTION_ID,seq

from (select rownum as seq,
club_question.QUESTION_ID from club_question
order by QUESTION_ID DESC)
where seq between 1 and 2

QUESTION_ID SEQ
----------- ----------
93 1
92 2

SQL> select QUESTION_ID,seq
from (select rownum as seq,
club_question.* from club_question
order by QUESTION_ID DESC)
where seq between 1 and 2


QUESTION_ID SEQ
----------- ----------
63 2
62 1

何故にclub_question.QUESTION_IDを
club_question.*にするとROWNUMが
おかしくなるのでしょうか??

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/09/29 10:40:00
  • 終了:--

回答(2件)

id:EPP No.1

EPP回答回数12ベストアンサー獲得回数02005/09/29 10:57:48

ポイント25pt

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/sq_tn02.htm

SQL チューニング編2 - SQL 実行計画解析、EXPLAIN、表走査、索引走査 - SAK Streets

回答ではないのでポイントは不要です。

まずDBの種類(SQLを見る限りOracleっぽいですが)とメジャーバージョンを書いてください。そうしないと回答しようがありません。

#補足ですが、rownumの扱いがoracle8までと9以降で変わっています。そのためメジャーバージョンにより挙動が変わります。


可能であれば、提示のURLに従って、各SQLの実行計画を表示してみて下さい。その違いを調べれば原因が判るかもしれません。

見て判らなかったらEXPLAINの結果をここに貼り付けてみるとか....

id:yashio

Oracleは10.1.3です。宜しくお願いします。

2005/09/29 11:00:28
id:EPP No.2

EPP回答回数12ベストアンサー獲得回数02005/09/29 14:00:25

ポイント25pt

外していたらポイント不要です。


の前に。

>#補足ですが、rownumの扱いがoracle8までと9以降で変わっています。

間違いでした(汗)7までと8以降でした。


Oracle8.1.7(自分の経験では10gも一緒でしょう)では、索引を使ってデータを取り出すか、使わずに取り出すかによってデータの並び順もROWNUMも変化するようですね。


以下のSQLを試してはどうでしょう?

#手元にOracleがないので確認はしていません。


----1a

select QUESTION_ID, rownum as seq

from (select

club_question.QUESTION_ID from club_question

order by QUESTION_ID DESC)

where seq between 1 and 2

----1b

select QUESTION_ID, rownum as seq

from (select

club_question.* from club_question

order by QUESTION_ID DESC)

where seq between 1 and 2

----

これで駄目なら(駄目な気がする)

----2a

select *

from (select QUESTION_ID, rownum as seq

from (select

club_question.QUESTION_ID from club_question

order by QUESTION_ID DESC)

)

where seq between 1 and 2

----2b

select *

from (select QUESTION_ID, rownum as seq

from (select

club_question.* from club_question

order by QUESTION_ID DESC)

)

where seq between 1 and 2

----

http://hamasyou.com/archives/Engineer-Soul/noieeiie.php

技術者の宝石箱 [それはBooks]

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/sq_kj04_2.htm

SQL 問い合わせ - スカラー副問い合わせ、cursor、row_number、over、with - SAK Streets

もしくはOracle9i以降に追加されたrow_number()関数でどうでしょう?


----3a

select QUESTION_ID,seq

from (select row_number() over (order by QUESTION_ID DESC) as seq,

club_question.QUESTION_ID from club_question)

where seq between 1 and 2

----3b

select QUESTION_ID,seq

from (select row_number() over (order by QUESTION_ID DESC) as seq,

club_question.* from club_question)

where seq between 1 and 2

----


※言うまでもないかもしれませんが、もし結果をseq順に並べたいのなら、SQLの最後にORDER BY句を付けてください。こんな感じに。付けないと多分だめです。


select QUESTION_ID, rownum as seq

from (select

club_question.QUESTION_ID from club_question

order by QUESTION_ID DESC)

where seq between 1 and 2

order by seq

id:yashio

ありがとうございます。

2bを使用して出来ました。

2005/09/29 16:15:52

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません