SQLの結果の違いについて

このQ&Aのポイント
  • SQLの結果が異なるという問題が発生しています。UNIONを使用したSELECT文で、あるデータベースでは結果が返らず、もう一方のデータベースでは意図した結果が返ります。
  • SELECT文1とSELECT文2をUNIONで結合したSQL文において、SELECT文2は結果レコード数が0ですが、SELECT文1は結果が返ります。
  • 結果が返らないデータベースと結果が返るデータベースのバージョンが異なり、結果が返らないデータベースにはDB2のパッチが当たっていない可能性があります。この問題はDB2のバグの可能性も考えられます。
回答を見る
  • ベストアンサー

SQLの結果が違う

データベースはDB2です。 UNOINを使用したSELECT文の結果が複数のデータベースで異なります。 あるデータベースからはレコードは戻らず、もう一方のデータベースからは意図した結果が返ります。 SELECT文1 UNION SELECT文2 のようなSQLです。 SELECT文2の方は結果レコード数は0ですが、SELECT文1の方は結果が返ります。 UNIONは、どちらかのSELECT文に結果が存在すれば、結果が返るはずなんですが・・・。 結果が返らないデータベースと結果が返るデータベースのバージョンは違うそうで、 結果が返らないデータベースにはDB2のパッチが当たっていないとか。 DB2のバグなんでしょうか? インターネットで調べたんですが、それらしき問題は見つかりませんでした。

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

  • ベストアンサー
  • yukion
  • ベストアンサー率42% (3/7)
回答No.3

その異常終了は大いに因果関係があると思います。エラーログから原因を判断する必要があります。 サポート契約がないのであれば以下のURLを調査するしかないと思います。 http://www-6.ibm.com/jp/software/data/developer/pdchecklist/

参考URL:
http://www-6.ibm.com/jp/software/data/developer/pd/
real_neo
質問者

お礼

調べたいんですが、サーバがお客さん所有で、派遣社員の私には調べる権限がありません。 回答ありがとうございました。

その他の回答 (2)

  • yukion
  • ベストアンサー率42% (3/7)
回答No.2

No.1です。障害関係の情報を検索してみましたが、この現象はありませんでした。 質問されている内容からは、このような結果になるのは有り得ないと思います。 もしサポート契約とかがベンダーとあれば、詳しいデータを取得して、調査依頼を出してはどうでしょうか。

real_neo
質問者

補足

今日もテスト中に発生しました。 関係あるかどうかはわかりませんが、問題のデータベースはよく異常終了します。といってもここ数日間ですが。 今日も問題のSQLを再実行して結果がレコード数0を確認した後、UNION部分からSELECT文2を外して実行したところ、異常終了しました。 データベースが壊れたりしていないかが気になります。 まあ、データベースが壊れたら、他のSQLも上手くいかないとは思いますが。

  • yukion
  • ベストアンサー率42% (3/7)
回答No.1

質問の内容を考えるためには、もう少し詳しい情報が必要です。 1.その複数のデータベースといっているのは内容がまったく同じなのか違うのか? まったく同じデータの内容でSQL文が同じであれば同じ結果になるはずです。 2.結果が返らないデータベースでは、SELECT文1を単独で実行した場合に何行かの結果が返るが、UNIONを指定した場合には返らないのであればあきらかに問題があるようです。 3.それぞれのDB2データベースのVersionは何ですか? CONNECT TO を行ったときにVersionナンバーが表示されると思いますが。

real_neo
質問者

補足

相談にのってくださり、ありがとうございます。 1.問題となっているSQLはトランザクションデータを抽出するものです。 マスタテーブル、トランザクションテーブルとも同じデータです。 2.それぞれのデータベースで、SELECT文1を単独実行した場合は、同じ結果が返ります。 SELECT文2も同じ結果になりますが、結果はレコード数0です。 3.正確なバージョンは今すぐはわかりませんが、結果が返らない方と返る方との違いは、 a.b.xxxxの部分のxxxxだけが違ったような気がします。

関連するQ&A

  • ストアド内で実行したSQLの出力結果について

    現在、引数の値を元に下記のようなSQL文を生成しています。 SELECT code, name FROM T_CGY WHERE code = '1111' UNION SELECT code, name FROM T_CGY WHERE code = '1110' UNION SELECT code, name FROM T_CGY WHERE code = '1100' UNION SELECT code, name FROM T_CGY WHERE code = '1000' ORDER BY code; ※出力されたSQL文に誤りがないかを確認する為にコピーしてターミナル上で実行したら該当するレコードを取得する事ができました。 それをストアドプロシージャ内で生成したSQL文を「QUERY EXECUTE」を実行して該当するレコードが取得できるように改造してみました。 下記が出力された結果です。 getCgyData -------------------- (1000,洋服) (1100,子供服) (1110,ズボン) (1111,長ズボン) 出力されたデータは私が望んだ内容なんですが・・・ 私的には下記のように出力したいと考えています。 col1    | col2 ------------------------- 1000  | 洋服 1100  | 子供服 1110  | ズボン 1111  | 長ズボン 何とか上記のように出力できるようにするにはどうしたらいいでしょうしょうか。 そもそも上記のように出力する事は可能なのでしょうか。 CREATE FUNCTION getCgyData (VARCHAR) RETURNS TABLE(col1 VARCHAR, col2 VARCHAR) AS ' DECLARE key ALIAS FOR $1; sql TEXT; BEGIN                 ・                 ・ ※ここでSQL文を生成して、変数(sql)に格納しています。                 ・                 ・ RETURN QUERY EXECUTE sql; END; ' language 'plpgsql' ; データベースのバージョンはpostgreSQL8.4.9です。 再度、申し訳ありませんがアドバイス、宜しくお願いします。 では、失礼します。

  • UNION ALLのように順番がありNULLを返す方法

    SQL初心者です。ACCESSデータベースに対するクエリを書いているのですが、 条件を配列として、その配列の順番に応じたSELECT文を書きたいのです。 SELECT * FROM access_db WHERE ID = '条件' UNION ALL SELECT * FROM access_db WHERE ID = '条件' UNION ALL SELECT * FROM access_db WHERE ID = '条件' UNION ALL... といった具合にSQL文を作成しているのですが、これでは見つからない条件がある場合に、行が繰り上がり条件を格納した配列とはずれが生じてしまいます。 見つからなかった場合にNULLまたはそれを表せる何かを抽出結果として組み込むことはできますか? SQL初心者のためUNION ALL程度しか近いものが見つけられなく、困っています。 どなたかよろしくお願いします。

  • 複数データベースへの問い合わせ

    同一サーバーに(DB1,DB2,DB3)と複数のデータベースがあった場合(ユーザーは同じです)、SELECTの際に複数のDBに対しての問い合わせをすることはできるのでしょうか? それぞれのデータベースはテーブルも全く同じ構造で、 そこから特定のフィールドのレコードだけを引っ張り出して使いたいのですが、SQLをどのように書いていいのかがわかりません・・・ ヒントだけでもいただけると嬉しいです。よろしくお願いします。

  • SQLの結果の取得方法について。

    件名の件でいくつか質問があります。 そもそも質問がおかしいということがあるかもしれませんので、もしそうだった場合はご指摘頂けると嬉しいです。 1.SQLの結果の取得方法はResultSetで複数行を取得する方法とカーソル(こっちもクラスはResultSet?)で1行ずつ取得する方法の2種類があるのでしょうか?  ※ PL/SQLなどではなくjavaでの実装になります。  またカーソルで取得する実装方法など参考になるサイトがありましたら教えて頂けると助かります。  PL/SQLのサイトばかりがヒットしてしまいまして・・・。 2.ResultSetで取得した場合、全部のレコードをメモリに展開するのでしょうか? それとも1行(もしくは複数行)毎にDBから実データを取得するのでしょうか。  自分で調べたところではResultSetの実装によるということですが、一度にメモリに展開するドライバもあれば、1行や複数行で展開するドライバもあるということでしょうか。  例えばOracleやDB2やPostgreSQLなどがどのような実装であるかはよく分かりませんでした。  それぞれがどのように実装されているか調べるにはどのようにすればよいでしょうか。 3.巨大なレコード数を結果として取得する際はResultSetで取得するとメモリを圧迫するから、1行ずつ取得した方がパフォーマンスがいいかもしれないとサイトで見たのですが、これはカーソルを使用するということでしょうか?  それともsetFetchSizeで1行指定をしてResultSetで取得するということでしょうか。 4.setFetchSizeは1文にしか反映されないと、どこかのサイトでみたのですが、1文というのはSQL1回ということでしょうか。  同じStatmentで違うSQLを発行する場合は発行毎にsetFetchSizeを呼び出すということでしょうか。  それとも例えば1SQLの結果が100レコードでsetFetchSizeを10にした場合、ループ内で10回setFetchSizeを設定しないといけないということでしょうか? 調べている動機はたくさんのレコードを取得するSQLがあるのですが、フェッチ?カーソル?で取得した方がパフォーマンスがいいのではという話を受けたのですが、その人もあまり詳しくなく、ネットで調べていたのですが、上記のような疑問が中々解消できず質問させて頂いた次第です。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • SQLの結果を更に絞り込む

    ADOのRECORDSETをSQLのSELECT文で抽出します。 そのRECORDSETに対して更にSQLをかけることは出来るのでしょうか? やりたいことはキーワード検索した結果に対して更に 別のキーワードで絞りこむといったことなのですか。 よい方法がありましたら教えてください。

  • Visual Basic SQL文の結果

    質問させてください。 Visual Basicからデータベースに接続をして、SQL文を実施できるツールを作っています。 接続はできているようなのですが、結果を画面に表示する方法がわかりません。 セレクト文結果として、デバック中にData Set ビジュアルライザー?では確認できます。 ボタンを押したらセレクト文を実行して、ラベルやDatawGridViewに表示させる方法を教えてください。 できそうなの処理をすると、DataTableの型にあっていない、などエラーがでてしまいます。

  • OS/390 DB2 簡単なSQLで結果が異なるのですが 

    簡単なSQLなのですが、 バージョン違いが起因するのか、 導入の際のテーラーリング作業の違いなのか、 SQL結果が異なって困ってます。 状況は以下の通りです。 テーブルA 定義内容 項目 a b c    ・    ・    ・ データ内容(aの値)    +-+    |a|    +-+    |1 |    +-+    |2 |    +-+    |3 |    +-+   ~~~~~   ~~~~~    | | SQL SELECT * FROM テーブルA    WHERE a = '1' OR a = '3' 実行結果 マシンA(DB2/UDB V6)    +-+    |a|    +-+    |1 |    +-+    |3 |    +-+ マシンB(DB2/UDB V7)    +-+    |a|    +-+    |1 |    +-+ 因みにUDB以前のDB2・V5でも、 DB2/UDB V6と同じ結果です。 またaについてはindex項目ではありません。 この結果を同じにするにはどうしたらいいか、 ご存知の方がいらっしゃいましたら、 アドバイスをお願いいたします。 (直感で考えるとV6以前の結果のほうが 正しいと思うのですが・・・)

  • 正規表現の使えるデータベースとSQL文の書き方が知りたい

    正規表現の使えるデータベースとSQL文の書き方が知りたいのですが、 Access2003,MySQL5,PsotgreSQL8のうち、可能なDBはどれでしょうか? たとえば、以下のように128バイト固定長のアルファベットの大文字小文字と数字のレコードがあり、 ^ABで検索すると、(2),(3)のレコードを抽出するSQLの書き方が知りたいのですが、可能でしょうか? AAACCC...(1) ABBCCC...(2) ABCCCC...(3) できればアクセス2003でできるとうれしいですが、可能なDBをご存じの方教えて下さい。 また、やはり速度的に非常に遅いものになるでしょうか?

  • SQLの速度をあげるには・・・

    テキストファイルからキーワードを拾って SQLをなげています SQLの質問になってしまうかもしれません いまはADO接続でやっています Open ファイル as input...... SQL = select * from tbl where name like '%キーワード%' execute(SQL) レコードセットの値で処理をいろいろ・・・ Loop もともとのDBの件数がものすごくおおくてselect文に結構な時間が かかってしまいます。速度をあげるほうほうってあるのでしょうか 私にはおもいつかなくて・・・ こういったほうほうは どう? ってのがありましたら おしえていただきたいのですが よろしくおねがいします。

  • SQL 複数のテーブルから重複なしでデータを取得

    同じフィールド名[名前]を持つテーブルが複数個あります。 仮にテーブル名を、A、B、C、Dの4個だとします。 それらのテーブルから、フィールド名[名前]のデータを重複なしで取得したいのですが、SQL文が思いつきません。 取得するフィールドは[名前]だけです。 select distinct(名前) from A union select distinct(名前) from B union select distinct(名前) from C union select distinct(名前) from D だと、各表に同じ名前が存在する場合は結果も重複してしまい、期待する結果が得られませんでした。 環境はOracle 9iです。 SQL文を教えてください。よろしくお願いします。