• ベストアンサー
  • 暇なときにでも

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のタグって使えるんでしょうかね?

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数1307
  • ありがとう数7

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

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

 データベースから、select文でORDER BY無しで全データ検索をかけると、順不同になります。これ、定義で順序を保証しないとなっているからです。現実として、DBMSが違えばもちろんのこと、下手すると、データ入力時の物理データファイルの空き領域の都合なんて理由で順番が変わります。そして、次の日にデータファイルの最適化(DBMSによっては必要です。)をすると、また順序がかわります。  SQLが複雑になるにつれ、もっといろいろな要素が絡みこんできます。SQLの最適化によりあなたが入力したSQLと等価だけど違うSQL文を実行している事だってあります。  さて、問題のSQLです。一見、選択するKOKYAKU番号が違うだけで、同じように動いたら、一連番号枝番の大小も同じになっても良さそうな・・・・と考えてはいけません。  入力順序が同じかどうかは質問文からは解らないし(というか、実運用では誰も知らないというのが普通ですよね。ついでに言えば、その時の物理ファイルの空き領域が飛び地になっていたかもしれません。)、選択した結果のデータ件数も違います。(ソートアルゴリズムによっては、対象の件数の偶数奇数で違う結果が出ます。)  事によったら、KOKYAKU番号11111111の時と22222222の時では、実行するアルゴリズムが違う可能性さえ否定できません。(優秀な最適化機構では、データベース上のデータの分布・偏りまで、統計情報として最適化に利用します。このような場合、当然、検索の条件によって最適化の結果が変わることもあるわけです。またテーブルのサイズが大きく変われば、最適化の結果も変わります。)アルゴリズムが変われば、出力の順序が変わっても不思議ではありません。  とりあえず思いつくままに落書きしてみただけで、結果の順序が変わる理由なんてまだまだいくらでも出てきます。    結論は、ORDER BYで明示したフィールド以外の順序を問うてはいけません。昨日の結果と同じ順番で出て欲しいというのでさえも×です。同じように出て欲しいのであれば、ちゃんとORDER BYに書きましょう。(もし、今は、思ったように動いても、明日のデータ数で同じように動く保証はありませんし、物理ファイルを再編成・最適化したら、きっと違う動きをします。)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 明示的に指定せずに同じような結果になってほしいなんて甘い考えは通用しないですね。。。 大変勉強になりました。

関連するQ&A

  • SQL文「DISTINCT」の「ORDER BY」について

    SQL文「DISTINCT」の「ORDER BY」について教えて下さい。 A列をDISTINCTで重複行の排除をしています。 その後、B列でORDER BYをかけたいのですが、エラーが 出てしまいます。A列でのORDER BYは成功します。 何か良い方法があれば教えて下さい。 よろしくお願いします。 SQL="SELECT DISTINCT A列 from table " &_ "WHERE (table.C列='100') " &_ "ORDER BY (table.B列) ASC " ⇒エラー    "ORDER BY (table.A列) ASC " ⇒成功

  • SQLコマンドのorder by句

    受注金額の大きい順にリストするために select 受注番号,受注金額 from 受注テーブル order by 受注金額 desc; を発行すると、受注金額(数値型)が未定義(null)のものが上位になってしまします。 受注金額がnullのものを零より小さい扱いでリストする方法を教えて下さい。 尚、・・・ where 受注金額 is not null は不可です。 宜しくお願いします。

  • sqlでのORDER BYについて

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

その他の回答 (2)

  • 回答No.2
  • noyuo
  • ベストアンサー率39% (33/84)

一連番号枝番を並べ替えに指定しないということは、その順序を希望しないことを暗黙に指定していることになるのですから、その順序を見て(期待して)はいけないですよね。 そのテーブルに両方のインデックスが張られていれば、もしかしたら、期待した結果がえられるかもしれません。 余計な想像ですが、ORDER BYによる並べ替え処理が、二分探査方式によってされていたら、データ数の奇数/偶数で結果が分かれるのかもしれませんよね.

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 ソートアルゴリズムによって結果が変わる可能性もあるのですね。 大変勉強になりました。

  • 回答No.1
  • yambejp
  • ベストアンサー率51% (3827/7415)

状況がよくわからないのですが、 ITIRENを逆順(DESC)でソート(ORDER BY)しているのですから、 その先頭行が表示されているのではないのですか? >同様のSQLを実行しているのに結果が変わってしまう どのへんが同様のSQLなのでしょうか? ぜんぜん違うSQLにみえるのですが・・・

共感・感謝の気持ちを伝えよう!

質問者からのお礼

そうでした。SELECT ITIREN… なので表示されるのは先頭行のみですね。失礼しました。 SQL文については、素人考えで「顧客番号のみを変えて他の記述は同じ文」を「同様のSQL文」としていました。 わかりにくい質問で申し訳ありません。

関連するQ&A

  • SQL文のGROUPとORDERの順番

    こんににちは、 得点表(学生番号、科目コード、得点)があります。 得点表から各学生の合計得点を求めて降順に整列する場合の正解は、 SELECT 学生番号,SUM(得点) FROM 得点表 GROUP BY 学生番号 ORDER BY 2 DESC だったのですが、この2はSUM(得点)のことでしょうか? また、 SELECT 学生番号,SUM(得点) FROM 得点表 ORDER BY 2 DESC GROUP BY 学生番号 のようにGROUP と ORDER をひっくり返した場合、間違いになるのでしょうか? お分かりの方がいましたら教えてください。 よろしくお願いします。

  • 秀丸でSQLを書く際に SQLの予約語だけ大文字

    秀丸でSQLを書く際に SQLの予約語だけを、大文字に変換するよい方法は? たとえば select * from table_1 where id=1 order by id desc; と書いて、マクロを起動すると SELECT * FROM talbe_1 WHERE id=1 ORDER BY id DESC; となるようにするよい方法はありませんか? また、予約語が「強調」されると尚良いです。

  • SQL文の質問 JOINとORDERの組み合わせ

    現在下記にてSQLを作成しています ■わからないこと JOINでORDER(昇順)を設定するにはどうすればよいのでしょうか? 現在ではエラーが出ます(演算子がありません) mySQL = "SELECT B.B名, B.D番号 " & _ "FROM Bフレ INNER JOIN B ON B.D番号=Bコード.コード " & _ "WHERE(((B.日付)>=#" & orderDate & "#) AND ((B.日付)<=#" & shipDate & "#)) " & _ "GROUP BY Bコード.B名, B.D番号" & _ "ORDER BY B.D番号 ASC; わかる方ご教授願います

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

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

  • 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 製造番号" & ";" ※部分に入れる記号がわかりません。 ' ? ,?それとも順序が違うのでしょうか?

  • SQL ORDER BY の結果について

    SQLのORDER BYの結果表示がおかしく困っています。 テーブル名:社員名簿 プライマリーキー無し (設定厳禁) フィールド: | 社員ID | 氏名 | 住所 | | VARCHER|VARCHER|VARCHER| | P1 | 田中 |東京都 | | P2 | 鈴木 |東京都 | | P10 | 高橋 |千葉県 | SQL文: SELECT * FORM 社員名簿 ORDER BY 社員ID 出力結果: | 社員ID | 氏名 | 住所 | | P1 | 田中 |東京都| | P10 | 高橋 |千葉県| | P2 | 鈴木 |東京都| 上記のような出力結果となってしまいます。 何か良い方法はありませんか? よろしくお願いします

  • 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 は最後に書くものだと思っていたのですが、 たまたま上記のような入れ子になった内側でソートしているソースを見ることがあり みなさんにお話をうかがいたく質問させていただきました。 よろしくお願いいたします。

  • SQLの外部結合について教えて下さい

    いつもお世話になっています。 SQL構文の外部結合が分らなくて困っています。 どうか教えて下さい。 JSPからString Nam = (request.getParameter("param"));で値を受け取ってその値でT_Tableと一致するデータのSQLを実行します。 SELECT * FROM T_Table where ID='"+ Nam +"' order by 日付 desc この結果とT_TableAの「番号」というフィールドと一致する問い合わせのSQLが分りません。自分なりに考えて作りましたがHTMLの部分の表示だけでレコードが表示されないので間違っているのだと思います。 色々調べてみましたが該当のサンプルがなかったので困っています。 教えて下さい!宜しくお願い致します。 【自分で作成してみたSQLです】 テーブルはSQL Serverです。 "SELECT * FROM T_Table where ID='"+ Nam +"' INNER JOIN where ID='"+ Nam +"' ON [T_Table].[番号] = [T_TableA].[番号] order by 日付 desc"

    • ベストアンサー
    • Java
  • 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
  • SQL得意な方

    仕事で困っています、 なにとぞお力添えを。 テーブル1から、TOP50 でaとbを表示させたいのです。 で、その際の条件として、 開始するレコードも指定したいのです。 下記SQLの[○]の部分に50が入っていたら、 51~100件を表示する、と、いうような。 SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a で、順調だったのですが、WHERE条件が なんだか怪しいらしく、 a >= ''の時だけはきちんと動くのですが、 ANDでc='1'をつけた所、普通に全件表示されてしまいます。 [ちゃんと51件目から100件目を表示するSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a [何故か全件表示になるSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a ※[何故かNOT IN (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。