質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

2回答

1816閲覧

ORACLEにおいて、ORDER BY の有無によって、結果の内容が異なることはありますか?(並び順以外で)

ichi7777

総合スコア0

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2021/05/27 08:40

編集2021/05/28 01:25

ORACLEの11において、
以下のようなSQLで、ORDER BYの有無で処理結果の列が表示されたりNULLになったりする現象が発生しています。
自分の認識ではORDER BYの有無で取得される内容が変わることはないはずなのですが、こういったことはありえるのでしょうか?

SELECT
--取得するのは以下の3項目のみ
T1.TCODE COL1
, T2.USERC COL2
, T2.USERNAME COL3
FROM
TABLE01 T1
LEFT JOIN TABLE02 T2
ON T1.USERC = T2.USERC
WHERE
T1.SDATE >= '20210201'
AND T1.SDATE <= '20210215'
-- ORDER BY T1.TCODE ★このORDER BY を付けた場合と外した場合で以下のように結果が異なる

※ORDER BY を付けた場合
COL1 COL2 COL3
111 221 331
112 222 332
113 223 333

※ORDER BY を付けない場合
COL1 COL2 COL3
113 NULL NULL
111 221 331
112 NULL NULL

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_3578

2021/05/27 08:42

Oracleの質問なのになぜOracleタグが付いてないのか
ichi7777

2021/05/27 09:22

修正しました。
takasima20

2021/05/27 12:38

SQL は実際のものに近いのを書いた方がいいんじゃないかなあ。 ちなみに GROUP BY とか使ってますか?
ichi7777

2021/05/28 01:28

修正しました。
q_sane_q

2021/05/28 04:36

T1.USERC も出力対象にしたらどうなるんでしょうか?
ichi7777

2021/05/28 05:07 編集

実際の結果をそのまま張り付けたものが以下です。(ORDER BY なしのほうは、エクセルで並び替えました) T1.TCODE, T1.USERC, T2.USERC, USERNAME ※ORDER BY あり    ※ORDER BY なし 132 8111 8111 test   132 8111 8111 test 266 8111 8111 test   266 8111 8111 test 267 8111 8111 test   267 8111 ​(NULL)​ ​(NULL)​ 268 8111 8111 test   268 8111 8111 test 270 8111 8111 test   270 8111 ​(NULL)​ ​(NULL)​ 273 8111 8111 test   273 8111 ​(NULL)​ ​(NULL)​ 276 8111 8111 test  276 8111 8111 test 280 8111 8111 test  280 8111 8111 test 283 8111 8111 test  283 8111 ​(NULL)​ ​(NULL)​ 285 8111 8111 test  285 8111 8111 test 286 8111 8111 test  286 8111 8111 test 289 8111 8111 test  289 8111 8111 test 291 8111 8111 test  291 8111 8111 test 314 8111 8111 test  314 8111 8111 test
guest

回答2

0

こういったことはありえるのでしょうか

目の前で見てみているわけですから、ありえるのでしょうね。

だとすると、実行したタイミングによっては、部分的にnullが表示される状況から推理して、

操作しているテーブルが、実は

1.マテリアライズドビューである可能性

2.テーブル単体ではなく、複数のテーブルが外部結合になっている可能性

ではないでしょうか?

そこへさらに、別のセッションで delete や update などトランザクションを、発生させているために、状態が代わって見えている。

という状況なのではないでしょうか?

※ ちょっと無理矢理なストーリー?ですかね(^o^)

追記

もし、「表示されている内容は、何万レコードのうちの先頭の数千レコードだけ、見えている状態」だと過程するなら。。。ですが、

この外部結合なら、 T2 が null が表示されることもありえます。

TABLE01 T1 LEFT JOIN TABLE02 T2 ON T1.USERC = T2.USERC WHERE T1.SDATE >= '20210201' AND T1.SDATE <= '20210215'

左の1列目は T1.TCODE ですが、結合は  USERC(ユーザーコード?)になっていますね。

これだと TABLE01 のには存在しない USERC(ユーザーコード?)の含まれていると、このような表ができます。

現実世界になぞらえると、営業担当者リストには(退社された営業マンは)記載されていないのに、過去の売り上げ記録には、(すでに退社された)営業マンのレコードが残っている場合です。

投稿2021/05/27 12:08

編集2021/05/28 03:25
Yoshi88

総合スコア623

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ichi7777

2021/05/28 01:30

何度実行しても同じ結果の為、別セッションで更新されている可能性はないですね。。 オラクルプラチナ保持者等が見ても原因がわからないとのことなので、何らかのバグでしょうか。
Yoshi88

2021/05/28 03:25

外部結合の条件がハッキリしたので、可能性について追記しました
ichi7777

2021/05/28 04:07

検索結果は30件ほどで、目視でも簡単に確認できるレベルなんですよねぇ。 本当に謎です。
guest

0

ORDER BYの有無で取得される内容が変わることはないはずなのですが、こういったことはありえるのでしょうか?

表示されているものが、データ全てなら在りえません。

order byの項目がプライマリーキーではなく、先頭の部分だけを確認しての話なら、単に順序だけが変わっているだけです。

以下の様なSQLを実行してデータが取得されるなら、順序が変わっただけという事になります。

SQL

1select COL1, count(*) 2from テーブル 3group by COL1 4having count(*) > 1

投稿2021/05/27 09:37

編集2021/05/27 13:01
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ichi7777

2021/05/28 01:32

やはりありえないはずですよね。 SQLを実行したツール(A5SQL)のバグかとも思ったのですが、ODP.netからの実行結果も同様となりました。何らかのバグかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問