• ベストアンサー

Oracleのorder byについて

こんばんわ、 質問です。 oracle8iを使ったWebアプリケーションがあり oracleのバージョンを10gへアップした際に、web画面で表示させる 項目のソート順が変わってしまいます。 SQLでselectした値を表示させているのですが、表示する値は 同じなのに表示される順序がバージョンアップの前と後で違います。 ちなみにorder by指定してあります。 この事象の原因とoracleのバージョンアップは何か関係があるのでしょうか? 過去に似たような経験がある方のアドバイスや解決方法をご存知の方がおりましたら何卒ご教示ください。 お願い致します。

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

似たような経験がありますが、どうもOracle10Gになって指定のない 部分については順不同となるようです。仕方のない話ですが。 8i当時は例えば日付、伝票No.、行とあった場合に 日付、伝票No.のみでorder by としていても、データの生成された 時間順序が行No.順であれば暗黙的に行まで並んでくれましたが、 10Gは指定しないと並びません。行がばらばらとなってしまいます。 バグではなく、指定の甘さが原因なのでこれは指定するしかないでしょうね。確実に並ばせたいのであれば。 order by をすべて指定してもそのとおりに並ばないということではないと思いますが。

msak777
質問者

お礼

なるほど、そういうことでしたか。 理解しました。 どうもありがとうございました。

関連するQ&A

  • Order by句でバインド変数を使うには?

    SQL文のOrder by句で2つのバインド変数を用いて、ソートする項目・ソート順を決めたいと思い、以下のようなSQLを作成いたしました。 Select row_Number() Over(Order by Case :ITEM When 'PJコード' then PJコード When '部署コード' then 部署コード end Case :LINE When '1' then DESC When '2' then ASC end .... バインド変数を直接Order by句に入れますと、結果は帰ってくるのですが、バインド変数の値がすべて無視されてデータが出力されます。 以上の理由より、Case文にてバインド変数の値を参照し、ソートする項目と順番を決めております。 上記のソースで実行しますとORA-00907:右かっこがありませんというエラーが表示されます。 2つ目のCase文(:LINE)を消し、最初のCase文だけを残して、並び順(DESC・ASC)を埋め込むと、実行される状態になります。 Oracleのバージョンは11gです。 ご回答よろしくお願いいたします。

  • order by区の記述位置

    以下のようなsqlを書いた場合、 (入れ子になった内側でorderbyを記述している) 6行目に書いたorderbyの動作(ソートキーの降順に並ぶこと)は oracle,sql server等、各環境で保障されるのでしょうか? 以下の例ではうまく動作していたのですが(oracle) 入れ子が多くなった場合もうまくうごくのでしょうか? -------------------- select a.* from (   select a.ソートキー from テーブル a   union all   select a.ソートキー from テーブル b   order by ソートキー desc ) a -------------------- 自分は、order by は最後に書くものだと思っていたのですが、 たまたま上記のような入れ子になった内側でソートしているソースを見ることがあり みなさんにお話をうかがいたく質問させていただきました。 よろしくお願いいたします。

  • ORDER BY句を使用しているSQL文に関して質問です。

    ORDER BY句を使用しているSQL文に関して質問です。 SELECT文にてORDER BY句を使用した場合、SELECT結果の件数によってソート順が変わるような事はあるのでしょうか? 事象としては以下の通りです。 以下のCUSTOMERテーブルがあるとします。 |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000001|000000000000| |0001|11111111|00000002|000000000000| |0001|11111111|00000003|000000000000| |0001|11111111|00000004|000000000000| |0001|11111111|00000005|000000000000| |0001|11111111|00000005|000000000001| |0001|22222222|00000001|000000000000| |0001|22222222|00000002|000000000000| |0001|22222222|00000003|000000000000| |0001|22222222|00000004|000000000000| |0001|22222222|00000005|000000000000| |0001|22222222|00000006|000000000000| |0001|22222222|00000007|000000000000| |0001|22222222|00000008|000000000000| |0001|22222222|00000009|000000000000| |0001|22222222|00000010|000000000000| |0001|22222222|00000011|000000000000| |0001|22222222|00000012|000000000000| |0001|22222222|00000013|000000000000| |0001|22222222|00000014|000000000000| |0001|22222222|00000014|000000000001| 埋め込みSQLを実行し、上記のテーブルに対し以下の条件でカーソルをオープンしました。 (1)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 11111111 ORDER BY ITIREN DESC (2)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 22222222 ORDER BY ITIREN DESC カーソルの1件目をFETCHしたところ、以下のような結果となりました。 (1) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000005|000000000001| (2) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|22222222|00000014|000000000000| 一連番号枝番をORDER BY句のソート条件に追加するか、WHERE句の条件についかすれば事象は解決するのですが、同様のSQLを実行しているのに結果が変わってしまうのがどうしても解せません。 もしご存知の方がいらっしゃいましたら、ご教授頂けると助かります。 テーブルの内容をごちゃごちゃと書いてしまったので、見づらくてすみません。。。 レイアウトがずれてたら更にすみませんm(_ _)m HTMLのタグって使えるんでしょうかね?

  • GROUP BY と、ORDER BY

    ACCESS97を使用しています。 SQLで、GROUP BY と、ORDER BYの両方を使用することは可能でしょうか? Set DB = CurrentDb() strSQL = "SELECT 製造番号 FROM 入庫データ WHERE " strSQL = strSQL + "整理NO='" & Me.整理NO入力 & "'" strSQL = strSQL + "GROUP by 製造番号" & ";"      ← ※ 'strSQL = strSQL + "ORDER by 製造番号" & ";" ※部分に入れる記号がわかりません。 ' ? ,?それとも順序が違うのでしょうか?

  • もうちょっと賢いSELECT文が書けないものでしょうか

    初めまして、最近SQLをかじり始めたぺーぺーです。 効率の悪いSELECT文しか書けずに困っています。 下記のテーブルsoftware_tableから、 ・name列「oracle」 ・version値が最大 のレコードに含まれるid(=3)を拾ってきたいのですが、自分の頭では副問い合わせを使う方法か、ソートを使う方法しか思いつきません。 問題は副問い合わせ・ソートを使うと計算コストが大きくなってしまうことで、できることなら副問い合わせ・ソートを使わずに解決したいのですが、何か方法はないものでしょうか? よろしくお願い致します。 ----------------------------- software_table id name version 1 oracle 1 2 oracle 2 3 oracle 3 4 postgres 1 5 postgres 2 6 postgres 3 7 postgres 4 ----------------------------- ■副問い合わせを使った方法 SELECT id FROM software_table WHERE name = 'oracle' AND version = (SELECT max(version) FROM software_table WHERE name = 'oracle'); ■ソートを使った例 SELECT id FROM software_table WHERE name = 'oracle' ORDER BY version DESC LIMIT 1 OFFSET 0; -----------------------------

  • sqlでのORDER BYについて

    SQL初心者です。 MySQLを使用しています。 SELECT文で、ORDER BYを2つ指定したいのですが、ORDER BYの複数指定方法が分かりません。 どなたかご教授お願いします。

  • GROUPBY ORDER BY

    idの大きい順から並べたいのですがうまくいきません 調べて サブクエリなどを使い実行しましたがうまくいきませんでした ご教授お願いいたします ソース $sql='SELECT memberid,mailid,max(name),max(day) FROM messageall WHERE mailid=? GROUP BY memberid ORDER BY id DESC LIMIT '.$limit.' OFFSET '.$offset; サブクエリでも試しましたが正直 ソースがめちゃくちゃでデータが表示されませんでした。 ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • PL/SQLにて、マスタから取得した値をORDER BY句に指定したい

    どなたかお判りになる方、ご教示ください。 ★やりたいこと PL/SQLにて、マスタから取得した値をORDER BY句に指定したい。 (例)以下のようなマスタがあるとします。 -------------------------- ソートマスタ SORT_MST ソート順 SORT_ORDER ソート項目 SORT_ITEM ソート種別 SORT_SBT -------------------------- この「ソートマスタ」の「ソート項目」には、以下のトランザクションテーブルの物理カラム名が格納されています。 -------------------------- トラン TRN 商品種別 ITM_SBT 商品コードITEM_COD 商品名 ITEM_NM 金額  ITM_AMN -------------------------- PL/SQLにて「ソートマスタ」から値取得後、「ITEM_COD ASC,ITM_AMN ASC」という文字列を作成し、「トラン」検索時にORDER BY句に指定したのですが、ORDER BY句が全く効いてくれません。 お忙しいところ恐れ入りますが、ご存知の方、よろしくお願い致します。

  • ORDER BYで並び替えなんですが…

    $result = mysql_query('SELECT * FROM hoge ORDER BY LPAD(NUMBER, 5, 0)') ; で並び替え(ソート)をすると 1 2 3 4 5 6 7 8 9 a 10 11 12 13 という結果で表示されます。 これを 1 2 3 4 5 6 7 8 9 10 11 12 13 a というように並び替えて表示させたいのですが…orz どのように構文を書けば宜しいのでしょうか?? いろいろ調べてみたのですが、それらしい内容のものが 見つからずに途方に暮れています。 どなたか御教授頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • Oracle 10.2.0 でMAX集計がおかしい!?

    VB6 で oo4o を使って Oracle DB開発をしています。 Oralce 8.1.6 から Oracle10.2.0 にサーバを切り替えました。 bというテーブルがあって、 a c d ---- ------ ----- 10 2 1 20 3 1 30 4 1 40 5 1 50 6 2 というデータがあったとします。 Select MAX(a) as a from b WHERE d=1 のようなSQLをVBから発行したときに SQL*PLUSでは、 a ---- 40 という結果が返ってくるのですが、VBでは、 a --- 10 20 30 40 のように複数行のレコードセットが帰ってきます。そのため、最大行を取得できません。Oracle8 のときは、SQL*PLUSと同じ結果が返ってきていました。ちなみに Select MAX(a) as a from b WHERE d=1 GROUP BY d ~~~~~~~~~~ と、GROUP BYを付けると、ただしい(SQL_PLUSと同じ値)値が取得できます。 Oracle10.2.0の問題か、oo4oの問題かと考えています。 ちなみにoo4oのオブジェクトは、 CreateObject("OracleInProcServer.XOraSession") で作成していて、クライアントのバージョンは 9.2.0.4.4です。 長文で失礼しますが、どなたかSQLを変更せずに解決する方法をご存じないでしょうか?