|
2010/04/20(Tue) 18:37:28 編集(投稿者)
■No49030 (らーじ さん) に返信 > 取得した値が意図した値でないため、正確な値を得るにはどのようにしたら良いかお伺いした次第です。 LEFT JOIN 構文に切り替えてみては如何でしょう。
> コードは以下の通りです。 データベースは何でしょうか? こちらで試してみた限り、0 となるパターンは再現できませんでした。 (ただし、別の問題が発生しましたが…)
> 取得元のデータは0もありますが、ほとんどが0ではありません。 下記のようなデータを用意して試してみました。
CREATE TABLE HINMASTER ( HIN_CODE NUMERIC(2) PRIMARY KEY ); INSERT INTO HINMASTER VALUES ( 10 ); INSERT INTO HINMASTER VALUES ( 20 ); INSERT INTO HINMASTER VALUES ( 30 );
CREATE TABLE TANATBL ( ID NUMERIC(1) PRIMARY KEY, HIN_CODE NUMERIC(2), HIN_PRICE NUMERIC(3) ); INSERT INTO TANATBL VALUES ( 1, 10, 110 ); INSERT INTO TANATBL VALUES ( 2, 10, 210 ); INSERT INTO TANATBL VALUES ( 3, 20, 320 ); INSERT INTO TANATBL VALUES ( 4, 30, 420 ); INSERT INTO TANATBL VALUES ( 5, 40, 540 );
SELECT ID, (SELECT HIN_PRICE FROM HINMASTER WHERE HIN_CODE = TANATBL.HIN_CODE) AS HIN_PRICE FROM TANATBL
上記を、Access MDB に対して実行したところ 1 1 2 2 3 3 4 4 5 (null) という妙な結果となりました。
ただし DAO 3.6 で接続した場合や、Access 2007 のクエリ画面では、 SQL Server と同じ結果が得られました。
さらに何回か繰り返していると、稀にサブクエリの列から 137.819369692441947535507567 といった謎の結果が得られたり、実行時エラーが発生する事もありました。
一方、同じ内容を SQL Server 2005 に対して実行したところ、こちらは期待通りに 1 110 2 210 3 320 4 420 5 (null) という結果を得ることができました。
また、テーブル定義を NUMERIC → NUMBER に変更した上で、 Oracle 10g に対して試した場合も、問題なく表示されました。
≪期待通りの結果となった組み合わせ≫ ・Provider=SQLOLEDB + System.Data.OleDb ・Provider=SQLOLEDB + ADODB ・System.Data.SqlClient ・Provider=OraOLEDB.Oracle + System.Data.OleDb ・Provider=OraOLEDB.Oracle + ADODB ・Provider=MSDAORA + System.Data.OleDb ・Provider=MSDAORA + ADODB ・DAO 3.6 ・Microsoft Access 2007 クエリ画面
≪期待と異なる結果となった組み合わせ≫ ・Provider=Microsoft.JET.OLEDB.4.0 + System.Data.OleDb ・Provider=Microsoft.JET.OLEDB.4.0 + ADODB ・Provider=Microsoft.ACE.OLEDB.12.0 + System.Data.OleDb ・Provider=Microsoft.ACE.OLEDB.12.0 + ADODB
|