• ベストアンサー

デフォルトでデータが表示される順番

質問があります。 oracle初心者です。 oracle8.1で insert文によってデータを登録すると 一番最後のレコードに表示されません。 select文(select * from "テーブル名")を 書いて全レコードを抽出すると、中途半端な位置に 最新レコードが表示されます。 デフォルトでテーブルのデータが表示される位置に 決まりというのはあるのでしょうか MYSQLでは最後の行に最新レコードが表示されるはずですが、 オラクルでは違うのでしょうか。 もちろん、文字コード順や数値の順番ではないみたいです。 困っていますご回答よろしくお願いします。

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

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

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

>デフォルトでテーブルのデータが表示される位置に >決まりというのはあるのでしょうか 無いです。 どのバージョンでもそうですが、順序を意識したselect分をしたいのなら、必ずorder by句でソート順の指定をしてください。 #アクセスパスによっても出力順が変わったりしますので。

19746999
質問者

お礼

急いでたので本当に助かりました。 ありがとうございました。

その他の回答 (2)

回答No.3

殆どのRDBMSでは、「order by」を指定しない限り、検索順序の保証はされていません。 >MYSQLでは最後の行に最新レコードが表示されるはず MySQLも、そんな保証はしていませんけど? MySQLのマニュアルにも、「order byなしでは順序保証しない」ことが明記されていますよ? 例外的にSQL Serverでは、「primary key」指定時に、「order by」なしでも順序保証しているようですけどね。

19746999
質問者

お礼

>MySQLも、そんな保証はしていませんけど? そうだったんですか! 初めて知りました。 本当に勉強になりました ありがとうございました。

回答No.2

>デフォルトでテーブルのデータが表示される位置に >決まりというのはあるのでしょうか ORDER指定をしない以上は、表示の順番はどうでも良いという意味になりますので、オラクルの都合で表示します。 オラクルにとって都合が良いのは検索順に出すことですが、検索順はオプティマイザが検索方法を考えるので、 状況次第で変わることになります。

19746999
質問者

お礼

急いでたので助かりました。 ありがとうございました。 大変参考になったので、k_o_r_o_c_h_a_nさんにも ポイント差し上げたいのですが 最初に回答していただいた方に差し上げることにします。 ごめんなさい。

関連するQ&A

  • accessのデータをoracleへinsertする方法

    環境 vb6、access2000、oracle10g、OS:WinXP Pro accessの中にある30,000件のレコードをvb6でoracle10gに日常的にinsertしようと考えてます。(ボタンクリック時etc) insert into 『oracleのテーブル名』 select * from 『accessのテーブル名』 とは記述できないと思うのですが、30,000回 loop→insertさせると 15分くらい掛かります。何か処理速度を早くなる良い方法はありませんか?  お知恵をお貸し下さい。宜しくお願い致します。

  • SELECT文のデータ取得タイミングについて

    お世話になります。 あるテーブルの集計を取得するSELECT文を発行した場合、 SELECT文の前後で毎分1000件前後のデータがINSERTされています。 その場合SELECT文は、SELECT文を発行した際のデータのみ抽出するのでしょうか? それとも、INSERTからCOMMITしたデータが発生するたびに、再度読み込みなおしをしているのでしょうか? ご存知の方いらっしゃいましたら、ご回答よろしくお願いいたします。

  • 異なるOracleサーバ上のテーブルを結合する方法

    異なるOracleサーバ上のテーブルを結合する方法 IPアドレスが異なるOracleのテーブルを結合して出力したいのですが可能でしょうか?2つのテーブルをローカルにダウンロードして結合表示するとパフォーマンスが悪いので、2つのサーバから直接データをダウンロードしたいのです。2つのOracleサーバは読み取り権限しか与えられておらず、SELECT文ぐらいしか使えません。 Oracle 10G Windows 2003 Server

  • SQLでDATE型のデータを参照するのは?

    SQLであるテーブルから日付型のデータを秒単位まで参照したのですが... そうですね、例えば"TABLE01"というテーブルの"Field01"っていう項目から 2000年9月7日の11:45のデータを抽出したい場合は、どような SELECT文を発行すればよろしいのでしょうか? ちなみに自分がやっているのはORACLE7です。

  • TruncateしたテーブルへのInsertの遅さが気になる

    こんにちわ。 日次処理として、毎晩ワークテーブルをTruncateしてInsertしなおすというプログラムを数年前に作りました。 このプログラムはVB6、ADO、OLE DBプロバイダはOracleのものを使っています。 他のテーブルからSelectし、それを元に1レコードずつInsert文を作っては実行を繰り返す処理で正直遅いのですが、このプログラムの動作が不思議です。 日々数十万件のInsertを行っているのですが、ログを確認すると最初の2万件のInsertには40分掛かるわりに最後の2万件は5分で終わるのです。 今まで処理時間の遅さが問題になることもなく、バグもなく動いているしであまり気にしていなかったのですが、最近なぜこのような動きになるのか気になってきました。 最初も最後もSelect結果に偏りはなく、Insert文を作る処理に掛かっている時間は同じようなものかと思います。 とすると、遅いのはDBでのInsert処理か?と考えています。 レコード件数が少ないうちのInsertには時間が掛かるものなんでしょうか? だとするとそれはなぜ? 別に処理速度を速くしたいとか言うことではなく、なぜInsertの処理時間にこれほどの差が生じるのかが気になっています。 なおこのテーブルは主キー以外に索引を作っていません。 Insert文を作る際の元になるデータは論理的な単位ごとにSelectします。1回がだいたい数十件ぐらいです。 またその論理的な単位の分のデータをInsertしおわるごとにcommitしています(数十件ごとのcommitになります)。

  • BLOB型項目をSQLの検索条件に指定して検索したいのですが。

    BLOB型の項目を持つTableに対して、SQLのSELECT文でBLOB型項目がNull(未設定)のレコードを抽出したいと思っています。 どのようなSELECT文を組めば良いのでしょうか? 方法がわからず困っています。 御教授下さい。 DBはOracle8.1.6、 OSはWindowsサーバ2003です。よろしくお願いします。

  • 多重insertについて

    お世話になります。 MySQLの経験はありますが、Oracleは初心者です。 Oracleで「多重insert」を行いたいと思っています。 この表現が正しいか分かりません、一度のinsert文で 多数のレコードを追加したいと思っております。 MySQLですと、 insert into XXXX values(X,'XX'),(X,'XXX'),(X,'XXX') のように、()と,で区切って一度の複数のレコードを インサートできますが、Oracleでは出来ませんでした。 Oracleで同様の動作を行う方法はあるのでしょうか? お手数をおかけ致しますが、よろしくお願い致します。

  • インサートした日付データについて

    インサートした日付データについて お世話になります。 Oracle11gと.NET C#にて開発をしております初心者です。 .NET C#側で日付型(yyMMdd)にした変数を引数にして ストアドプロシージャでOracleのテーブルにインサートした 後、テーブルで結果を見てみると、 下記の様になってしまいます。 頭の20が余計に思います。 考えられる原因としてはどの様な事がありますでしょうか。 テーブルの受けるフィールドの型も日付型です。 ご教授下さいます様、宜しくお願い致します。         記 インサート前(C#側変数の値確認時)     インサート後(Oracleテーブル確認) (例) 20101105               20201011 05:00:00    

  • INで抽出した順番に並び替え(SQL)

    MySQLでINで抽出した順番で並び替えて表示したいのですが、簡単に行う方法はありませんか? [例] SELECT ID,NAME FROM TABLE WHERE ID IN (5,7,3); このSELECT文の抽出結果を5,7,3の順番に並び替えたいのです。 もちろん力技で行うこと(1つずつSELECTで抽出して表示)は可能なのですが、あまりにもスマートではないので・・・。

    • ベストアンサー
    • MySQL
  • オラクルのデータをAccessに追加 無限ループ

    前回、オラクルからデータを取り出し、Accessのテーブルに書き込みを教えて頂き、データ追加は出来たのですが、データ追加時に無限ループが発生しました。 【環境】 Oracle:10g Access:2010 Dim CON As New ADODB.Connection 'Oracle側コネクション Dim RS As ADODB.Recordset 'Oracle側レコードセット Dim SQL As String 'Oracle側SQL文 Dim i As Integer '処理用インクリメント Dim DT As Date '抽出日付変数(日付型) Dim sDT As String '抽出日付変数(テキスト型) Dim RS2 As ADODB.Recordset 'Access側レコードセット ◎現在の状況 Dim CON As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim i As Integer 'DB接続定義 CON.Open "DSN=DNS名;UID=ユーザー名;PWD=パスワード;" 'SQL文 SQL = "SELECT " SQL = SQL & "カラム1," SQL = SQL & "カラム2," SQL = SQL & "カラム3" SQL = SQL & "FROM オラクルテーブル名 " SQL = SQL & "WHERE 抽出条件 " SQL = SQL & "AND 抽出条件" SQL = SQL & "GROUP BY カラム" SET RS = CON.EXCUTE(SQL) ’取得したレコード数表示 MsgBox "オラクル側のレコード数は: " & RS.RecordCount (1)↑↑↑オラクルから、抽出したレコード数表示 rs2.Open "新しいテーブル名", CurrentProject.Connection, adOpenKeyset, adLockOptimistic rs.MoveFirst Do Until rs.EOF rs2.AddNew rs2!カラム1 = rs!カラム1 rs2!カラム2 = rs!カラム2 rs2!カラム3 = rs!カラム3 rs2.Update rs2.Close: Set rs2 = Nothing rs.close: SET RS = Nothing con.close:SET CON=Nothing end sub 上記を実行したところ、いくら待っても処理がおわらず、強制終了をかけた所、新テーブルには、約150万件追加されてました。 (1)でオラクルから抽出した、レコード数を表示させてみた所、-1でした。 ◎疑問点、 -1ってありえない数値だと思うのですが。 ちなみに、オラクル側で同様のSQLを実行させた所、取得件数は48件でした。 上記について、ご存じの方がいらっしゃいましたら、アドバイスお願いいたします。