• 締切済み

DB接続先をPostgreSQLからSQLServerへ変更したらSQLの結果が違う

データベースの接続先をPostgreSQLからSQLServerへの変更作業をしています。 PostgreSQL 8.1.9 --> SQLServer2005 ひとつ、変な現象が起きています。 移植前と移植後のDBで実行したSQLの検索結果が違いました。 SELECT a.ro_no, b.data_name FROM table_1 a, table_2 b, table_3 c WHERE b.data_name <> '' AND a.code_no = b.code AND a.user_id = c.user_id ORDER BY a.ro_no, b.data_name; ORDER句を細かく指定していないので、データ並びが違うのはしょうがないと思うのですが、件数が違うのはどういうことでしょうか? データに規則性が無いので、どこがおかしいのか?という見当もつかない状態です。 データベースにデータを移植する際の注意点、上記の現象等の回避策等がありましたら教えてください。 宜しくお願いいたします。

  • jobvba
  • お礼率60% (166/274)

みんなの回答

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.2

>SELECT > a.ro_no, > b.data_name >FROM table_1 a, > table_2 b, > table_3 c >WHERE b.data_name <> '' > AND a.code_no = b.code > AND a.user_id = c.user_id >ORDER BY a.ro_no, b.data_name; SQL Serverの照合順序はどうなっていますか? これは比較の際に大文字小文字を区別するかどうかなどを指定します。 以下URL参照 http://msdn.microsoft.com/ja-jp/library/ms187582.aspx 複数表とジョインしているので、比較の設定が異なるせいな気がします。 ジョインで複数件数が返ってきている気がしますので、該当データを確認してください。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

移行方法がわかりませんが、移行時に空文字がNULLに変わってしまったということはあり得ますか?

jobvba
質問者

補足

javaで、データベースを移行するためのプログラムを作成しました。 カラムの型は、データベースに合わせて動的にカラム型を変更しています。 急いで作ったので、ミスはありました。空文字とNULLのチェックを行い、修正した記憶があります。 しかし検索結果が同じでした。件数も修正前のものと一緒でした。 SQLにIS NOT NULLの条件式を加えても、同じ結果でした。 おかしいと思うのは、SQLServer2005側で上記SQLを実行すると、PostgreSQLの検索結果より多い点です。 あと、移植後の各テーブルのレコード数は一致していることを確認しています。

関連するQ&A

  • postgreSQL SQL

    postgreSQL7.3で以下のようなデータの並び替えを実現したいと思っています。 下記のようなデータを・・・ no | recno | name ----+-------+------ 1 | 1 | a 1 | 1 | b 1 | 2 | c 1 | 4 | a 2 | 3 | a 2 | 3 | c 2 | 3 | b 3 | 5 | b 4 | 6 | a 下記のような並びにSQLで取得することは可能でしょうか。 no | recno | name1 | name2 | name3 ----+-------+------+------+------ 1 | 1 | a | b | 1 | 2 | c | | 1 | 4 | a | | 2 | 3 | a | b | c 3 | 5 | b | | 4 | 6 | a | | noとrecnoのグループごとにnameを横に並べていきたいのですが、 可能なのでしょうか。 できれば、nameは個々のカラムに出力したいのですが、 配列のように1つのカラム内にカンマ区切りでの出力でも構いません。 上記のような表示が可能であれば、SQL文もご教授いただけますと幸いです。 宜しくお願いいたします。

  • PostgreSQLでの複数結果のまとめ方

    下記の様テーブルよりproduct_idごとに【結果】の様な形として 出力したいと考えております。 【TableA】 order_id|product_id|product_name | quantity 001  product001  商品名1  2 002  product001  商品名1  1 002  product002  商品名2  2 003  product002  商品名2  1 003  product003  商品名3  1 【結果】 product_id|product_name|quantity|order_id product001  商品名1    3     001, 002 product002  商品名2    3     002, 003 product003  商品名3    1     003 SELECT product_id, max(product_name), sum(quantity), order_id FROM TableA GROUP BY product_id, order_id としてみたのですが、 product_id|product_name|quantity|order_id product001  商品名1    3     001 product001  商品名1    1     002 product002  商品名2    2     002 product002  商品名2    1     003 product003  商品名3    1     003 となってしまい、order_idを上記の様にセルにまとめて表示する方法をお教え頂けますと幸いです。 MySQLではGROUP_CONCAT関数を使う事で実現出来たのですが PostgreSQLでの実現方法が分かりかねています。 尚、PostgreSQLのバージョンはPostgreSQL 8.1.23です。 どなたかご教示頂けますと幸いです。

  • SQLserverからPostgreSQLに移行したい

    PHPとSQLserverを使用した環境でデータを作成していましたが、 DBがPostgreSQLに変更になりました。 接続するところまではできましたが、 クエリ作成、結果を出力するところがわかりません。 WEBで検索しましたが、よくわかりませんでした。 どうぞ宜しくお願い致します。 ********************************************************** SQLserverを使用する前提で作成したデータ ********************************************************** $sql = "select * from テーブル名"; $rc = mssql_query($sql,$cont); print("<table>"); while ($array = mssql_fetch_array($rc)) { print("<tr><td>"); print "".$array["氏名"].""; print("</td><td>"); print "".$array["住所"].""; print("</td><td>"); print "".$array["電話番号"].""; print("</td></tr>"); } print("</table>");

    • ベストアンサー
    • PHP
  • 2つのDBからマージした結果をSQLで抽出するには

    ■下記の様な2つのデータベースとデータがあった場合に算出結果の様な形でデータを抽出したいのですが、SQLで実装するにはどうすれば良いでしょうか? データベースはOracleを使用しています。 【データベースA】 担当者  商品 担当者A りんご 担当者B りんご 【データベースB】 担当者  商品 担当者A みかん 担当者C みかん ■算出結果 担当者  商品 担当者A りんご、みかん 担当者B りんご 担当者C みかん

  • SQLServer2000 SQL文について

    SQLServer2000 SQL文について Where句内で、このような演算指定はできますか? できない場合このようなSQLを実行したい場合 他にどのような方法が考えられますでしょうか? select a.id from a,b where a.yymm = b.yymm-1

  • WITH句を使用したSQLの結果

    WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、 WITH TMP AS (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM TMP) T1, TMP T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20; Oracle10.2.0.3.0のバージョンで ALLCNTが21になってしまう現象が発生してしまいました。 Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、 バージョンによる不具合は考えられますでしょうか。 それともSQL自体なにか悪い部分があるのでしょうか。 ちなみに T2.CHECKROWNUM BETWEEN 1 AND 100; と帰るとALLCNTが101と帰ってきます。 また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに 置き換えると正しくALLCNTが取れます。 SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO)) T1, (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20;

  • SQLServerでのSQL文に関して(Accessより)

    SQLServer2005とAccess2000で改修をしています。 共にADO接続をしています。 下記のように単純にUPDATEしているSQLがあるのですがエラーとなります。 フラグAはAccess側から見るとYes/No型 SQLServer2005から見るとビット型です。 (DB.Excute (UPDATE tblテーブル名 SET フラグA = Yes WHERE ID = 1)) エラーはメッセージが出るわけではなく、更新が決定されないというか… デバック自体は何も言われず通るのですが 当処理記述のMDBを閉じた後、下記SQLにてリスト表示させると SELECT IIF(フラグA = NO, '','済') FROM tblテーブル名 WHERE フラグA = NO とすると'済'とは表示されないID=1のレコードが抽出されます。 Access側からリンクテーブルを開き 当レコードのフラグAを手で変更しようとすると 「データの競合」メッセージが表示され「レコードの保存」ボタンの押下は不可です。 見えるレコード値は「0」です。 結局試行錯誤の結果 UPDATE tblテーブル名 SET フラグA = -1 WHERE ID = 1 とすることでSELECT結果は正常となったのですが 原因と、解決方法が適切かがわかりません。 改修中のプログラムは、Yes/No、True/False、-1/0の記述が混在していて 今までYes/No型やビット型、Accessを使ったことがないのでさっぱりです。。 ちなみに現システム使用環境はSQLServer2000とAccess2000/2003です。 普通に動いているようなので、勝手に既存SQLを変えてもいいものか、 むしろSQLServerのバージョンを変えることで変えなければならないのか 判断できたらいいなと思っています。 すいませんが、よろしくお願いいたします。

  • access で結果の出るSQLが、MySQLではできなくて困っていま

    access で結果の出るSQLが、MySQLではできなくて困っています。 普段、ちょっと古いですが、Access2002を使用しています。 どうしても、Linuxサーバー上でデーターベースを利用する必要がでて、Fedora13に、mysql 5.1.48 をyamでインストールしました。 ところが、必要なSELECT検索が出来ず、困っています。 次のようなテーブル構造だと思ってください。 table A id|No ---- a1|01 b1|11 c0|20 table B No|option1|option2 ---------- 01|L   |Red 01|S   |Red 01|L   |Green 01|S   |Green 11|S   |(値なし) 11|L   |(値なし) このNoとオプション1、2から、IDを割り出したしたいのです。 オプション1,2は、存在していないデータもあります。 Accessなら、table A の No と table Bのoption1、option2 を &で結んで、結合プロパティをtable Aの全レコードに指定したSQL SELECT A.id, [A].[No] & [B].[option1] & [B].[option2] AS test FROM A LEFT JOIN B ON A.[No] = B.[No] WHERE ((([A].[No] & [B].[option1] & [B].[option2])="01LRED")); とすれば、a1 と結果が返ります。 table B にオプション値の登録のないものでも、 SELECT A.id, [A].[No] & [B].[option1] & [B].[option2] AS test FROM A LEFT JOIN B ON A.[No] = B.[No] WHERE ((([A].[No] & [B].[option1] & [B].[option2])="20")); とすれば、C0が返ってくれます。 ところが、同じテーブル構成をMySQLに作成し、 SELECT A.id, A.No & B.option1 & B.option2 AS test FROM A LEFT JOIN B ON A.No = B.No WHERE A.No & B.option1 & B.option2 = "01LRED"; を入力してみましたが、結果が出ません。 エラーらしきものといえば、 Empty set, 5 warnings (0.00 sec) が表示されています。 結合の方法が違うのかと思い、Googleで調べ SELECT concat(A.id, A.No & B.option1 & B.option2) AS test FROM A LEFT JOIN B ON A.No = B.No WHERE (A.No & B.option1 & B.option2) = "01LRED"; と、concat を使ってみましたが、だめでした。 MySQLで、上記のように複数のテーブル/フィールドを結合して、その値をもとに検索することはできないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • javaにてデータ取得

    JAVAカテゴリーで質問しようかこちらにしようか迷ったのですが。。。 あるテーブルを以下の様に内部結合しています。 select * from t_table a, t_table b where a.id=b.id and a.no=0 and b.no=1 この時、t_tableのあるカラムtestcolを取得したいとおもっております。 言語はjavaで、データベースはpostgreSQLです。 rs.getString("testcol"); rsはResultSetオブジェクトです。 これで、データは取得できるのですが、条件のt_tableの別名aのデータ が取得されます。別名bの方を取得したいと思い、単純に rs.getString("b.testcol"); 等としたら、「カラム名がありません」というエラーになりました。 getStringのパラメータとして、カラムインデックス(数値)も 指定できるので、それで行うと取得可能でした。 カラムインデックス指定ですと、プログラムのメンテナンス上支障をきたす ので、なんとか、カラム名の指定で行いたいと思っておりますが、 どうすればいいのでしょうか?

  • SQLで・・

    すみません、教えてください。 次のようなデータがあります。 table_A Name1 Name2 ----------- 1   2 3   4 table_B ID    Name --------------- 1     あ 2     い 3     う 4     え 次のような検索結果が欲しいとします。 Name1 Name2 ------------- あ    い う    え この結果を導くSELECT文はどう書けばいいでしょうか? 今、 select B.Name as Name1, C.Name as Name2 from table_A A, table_B B, table_B C where A.Name1=B.ID AND A.Name2=C.ID とやってみましたが、検索結果は0件になってしまいます。 お知恵をお貸しください!