PostgreSQLの普通のSQLでデータが取得できない理由

このQ&Aのポイント
  • PostgreSQLの普通のSQLでデータが取得できない理由について解説します。
  • セットアップ方法や設定の違いが原因で、vbaで流したSQLではtokucdの値が取得できない場合があります。
  • また、Accessのクエリでは同様のSQLが正しく処理されることがあります。
回答を見る
  • ベストアンサー

postgresqlの普通のSQLでデータが取得できません。

postgresqlの普通のSQLでデータが取得できません。 下記のようなSQLがあります。 SELECT msiten AS kaisyacd,mtokuicd AS tokucd,mchikucd AS chikucd,mchikunm AS chikunm,nmakercd AS makercd,mdealer AS dealercd,mname1 AS name1,mname2 AS name2 FROM msitenmst LEFT JOIN ndealermst ON (mtokuicd = ntokuicd) AND (msitencd = nsiten) WHERE mtokuicd > 100000 (項目名・テーブル名など無理に変更していることをご了承ください。) これをvbaで流すとtokucdの値のみ取得できません。(0になります)他の項目は正しく取得できています。 Accessのクエリで同様のSQLを流しても正しく処理されます。 なぜ、このようなことが有り得るのでしょうか? 非常に困って居ます。 ヒントでもかまいませんので教えていただけないでしょうか? お願いいたします。

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

  • ベストアンサー
  • med2dic
  • ベストアンサー率77% (21/27)
回答No.1

Accessのクエリで正しく処理されるようなので、sqlの問題ではなくvbaでのtokucdの取得方法に問題があるのではないでしょうか? どのように取得しているのかわかりませんが、そちらをもう一度見直してみてはどうでしょうか?

papope
質問者

お礼

ご回答ありがとうございます。 仰るとおりに見直してみました。 良く思い出すとPOSTGRESQLのODBCドライバには過去にも苦労させられていました。 数字の合計が正しく出力されないなど・・・・・・ 今回も同様の事象かと思い、ODBCドライバのupgrade(バージョンアップではありません) を行いましたところ正しく動作してくれました。 見直す(思い返す)と言う大事なことを忘れていました。 本当にありがとうございました。

関連するQ&A

  • フィールドのデータ型を取得して判断したい

    syscolumns から 各フィールドごとのデータ型を取得して「数字」項目か「文字」項目か判断させたいのです。 要は Where句で使うパラメータにフィールドが「文字」項目であれば自動的に「'」を付与するようにしたいのです。 下記のSelect文でscaleがNULLにも関わらずタイプに「文字」と入りません、どうしてでしょうか ---------------------------------------------------------------- select sc.name as フィールド名,sc.scale,case sc.scale when null then '文字' else '数字' end as タイプ from マスター管理_DB.dbo.sysobjects as so join マスター管理_DB.dbo.syscolumns as sc on so.id=sc.id join マスター管理_DB.dbo.systypes as st on sc.xtype=st.xtype where so.type='V' and left(so.name,2)='K_' and LEFT(st.name,3)<>'sys' ---------------------------------------------------------------- (フィールド名)  (scale)  (タイプ) 勘定科目コード   0     数字 勘定科目名    NULL   数字(←「文字」になってほしい) 貸借         NULL   数字(←「文字」になってほしい) 計科目名      NULL   数字(←「文字」になってほしい) ---------------------------------------------------------------- また、日付(日時)を判断できる項目はないでしょうか? よろしくお願いします。

  • postgreSQLで更新後のデータを取得したい。

    postgreSQLで更新後のデータを取得したい。 初めて質問させていただきます。 postgreSQLでupdateした後、更新後のデータをselectで取得したいのですが、 トランザクションが完了するまでにselect文が発行されているみたいで、更新前のデータを取得してしまいます。 それぞれ、違うファイルから投げられているので、同じトランザクションにすることはできません。 何かいい方法があればご教授お願いします。 a.phpで下記のSQLを発行 update test_tbl set test1 = 'aaa' where test2 = 'bbb' a.phpが走っている間に、下記のb.phpが実行される。 select test1 from test_tbl 環境 php5 postgres8.1

  • 1つのsql文でデータを取得したい

    phpとmysqlを連携させデータを取得しています。mysql5です。 現在は2つのテーブルからデータを取得するため以下のように2回のsql文を発行しています。 $sql = 'SELECT products_id, name, products_flag, comment1, IF("' . $products->beforedays . '" < DATE(create_date), "1", "0") as new, FROM products WHERE status = ? AND del_flg = ? ORDER BY create_date DESC'; // 1回目のsqlで取得したproducts_idを参照し下記のsqlを実行 $sql = 'SELECT MIN(price1) as min_price1, MAX(price1) as max_price1, MIN(price2) as min_price2, MAX(price2) as max_price2, IFNULL(price2, price1) as price0, stock FROM products_class_detail WHERE products_id = ?'; これを1回のsqlにまとめる場合どのような書き方になるでしょうか? 自分なりに下記のようにしてみたところ動作はするのですが複数のデータが条件に 当てはまるはずがminとmaxがあるためか条件に当てはまる最後のデータのみしか 取得されませんでした。 ※試しにmin,maxを外すと複数のデータを取得できました。 $sql = 'SELECT products.products_id, products.name, products.products_flag, products.comment1, IF("' . $products->beforedays . '" < DATE(products.create_date), "1", "0") as new, MIN(products_class_detail.price1) as min_price1, MAX(products_class_detail.price1) as max_price1, MIN(products_class_detail.price2) as min_price2, MAX(products_class_detail.price2) as max_price2, IFNULL(products_class_detail.price2, products_class_detail.price1) as price0, products_class_detail.stock FROM products, products_class_detail WHERE products_class_detail.products_id = products.products_id AND products.status2 = ? AND products.del_flg = ? ORDER BY' . $where_sql; 商品の情報を取得するsqlで最後のorder句は商品の並び順の変更でユーザーの指定した 順番(新着順や価格順等)で表示するためのものです。 2回のsqlの場合は問題なく動作していたのですがで新着順や価格順に並び替えを行うため 1回のでsqlで行いたいと思っております。 新着順の場合は1回目のsqlに条件が入るので問題ないのですが価格順の場合は2回目の sqlに条件が入るので2回のsqlではうまく並び替えができませんでした。 ソースの短縮にもなり可能であれば1回のsqlで完結させたいのですがどうすればいいものか わからずつまづいております。 詳しい方がいらっしゃいましたら宜しくお願い致します。

  • LEFT JOINが2つあるSQL文でANDの意味

    ■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a  LEFT JOIN being b ON a.hoge_id = b.id  LEFT JOIN call c ON c.call_id = a.hoge_id   AND f.hoge_id = 12  WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

    • ベストアンサー
    • MySQL
  • SQLについて

    こんにちは、honiyonです。  良い質問タイトルが思いつきませんでした...(^^;  2つのテーブルがあります。(仮定です)   ・オーナーの情報テーブル(owner)   ・オーナーの車の情報テーブル(car)  この2つのテーブルを利用して「男性の人で、黒い車に乗ってる人の車種名」を検索しようとしました。  これを1つのSQLで   SELECT car.name FROM owner,car WHERE (owner.no=car.ownerno) and (car.color='black') and (owner.sex='MAN');  とか、   SELECT car.name FROM (SELECT * FROM owner WHERE (owner.sex='MAN')) AS O2, (SELECT * FROM car WHERE (car.color='black')) AS C2 WHERE (owner.no=car.ownerno);  とかやってみましたが、涙が出るほど遅いです。  しかし   SELECT * INTO TABLE owner_tmp FROM (SELECT * FROM owner WHERE owner.sex='MAN'); SELECT * INTO TABLE car_tmp FROM (SELECT * FROM car WHERE car.color='black'); SELECT car_tmp.name FROM (owner_tmp.no=car_tmp.ownerno);  とすると超高速です。  なんとかテンポラリを作らず、出来れば1つのSQL文で高速に冒頭の処理を行いたいのですが、良い方法はないでしょうか。 是非お知恵を貸してください。  宜しくお願いします(.. #データベースはPostgreSQL 7.2.3です。

  • SQL副問い合わせ内のエイリアス

    DEPARTMENTとEMPLOYEESのテーブルがあり、そこから社員のいない部署を取得しようとしているのですが、わたしの書いたSQLがうまく動きません。作動しない理由をご教授くだされば助かります。オラクル8.1.7.4.1で動作させなければならず、left outer joinが使えないところからの質問です。 データはこういう構造です(*がプライマリーキィを表す)。 DEPARTMENT: *DEPT__T, DEPT_NAME, .... EMPLOYEES: *EMPLOYEES__T, DEPT_NAME, ... これに対して、 select dept__t, (select count(*) from employee where department.dept__t = employees.dept__t) counter from department where counter = 0 というSQLで社員のいない部署を取ろうとしたのですが、ORA-00904: "COUNTER": invalid identifier.が返されてしまいます。 WHERE文にcounterというエイリアスではなくカラムそのものを書くと問合せが正常に作動するのですが、なぜでしょうか。オラクルのバージョンが古いことが原因でしょうか。

  • SQL文で質問があります。

    商品マスタがあり、データは下記の感じで登録されています。  コード | 商品名  | 商品カナ | 分類コード ・・・ ---------------------------------------------------------  0001  | マウス  | マウス  | 01     ・・・  0002  | キーボード| キーボード| 01     ・・・  0003  | モニター | モニター | 01     ・・・          ・          ・          ・ SQL文で質問があります。 下記のSQLでは取得できるんですが・・・ SELECT * FROM M_SHOHIN WHERE code = ANY('{0001,0002,0003}'); 下記のSQLを実行したらエラーが出力されました。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT ARRAY_AGG(code) AS code FROM M_SHOHIN WHERE class_code = '01' ); ERROR: operator does not exist: character varying = character varying[] HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. なので下記のようにCASTをするようにして実行したらエラーは出力されなくなりましたがデータの取得ができませんでした。 SELECT * FROM M_SHOHIN WHERE code = ANY(  SELECT CAST(ARRAY_AGG(code) AS VARCHAR) AS code  FROM M_SHOHIN WHERE class_code = '01' ); どのようにすれば取得できますでしょうか。 説明が下手で申し訳ありませんがアドバイスいただけませんでしょうか。 データベースはPostgreSQL 8.4.9です。 宜しくお願いします。

  • PostgreSQLの配列項目のデータ展開の方法がわかりません

    PostgreSQL7.4 + PHP4.3 + Pearの環境です。 配列の項目から要素を展開しようとしたところでハマりました。 $sql = "select * from T"; $result = $db->query($sql); $row = $result->fetchRow(DB_FETCHMODE_OBJECT)) $id = $row->id; $a1 = $row->a1; a1は配列項目で、0,1,2,3 のように要素が入っているのですが、上のソースだと、 $a1[1]='{' $a1[2]='0' $a1[3]=',' $a1[4]='1' のように展開されてしまいました。select文からみるとa1項目は {0,1,2,3} という文字列で入っているのがわかりました。 SQL文が select a1[1],a1[2],a1[3],a1[4] from T; のような形だと正しく取得できますが、実際は配列の要素数が不定なのでこのようなSQLは使えません(長くなるし) 色々調べてみましたが、 $a1='{0,1,2,3}' を $a1[1]='0' $a1[2]='1' $a1[3]='2' $a1[4]='3' に展開する関数が見当たらないみたいです。PostgreSQLの配列項目を扱ったのは初めてなのでとまどっているのですが、簡単にarray変数に展開する方法はないでしょうか。

    • 締切済み
    • PHP
  • 状態によって、取得したいデータをかえたい場合のSQLについて

    状態によって、取得したいデータをかえたい場合のSQLについて 初心者で困っています。 以下は、状態が1,2,3の場合はデータを取得し、4の場合はデータを取得しないSQLです。 SELECT  みかん.連番  みかん.入荷日 FROM  みかん  INNER JOIN 状態   ON みかん.状態 = 状態.連番 WHERE  みかん.状態 IN (1,2,3) みかんT 連番   入荷日    状態 1   2010/02/01  1 2   2010/02/03  3 3   2010/02/08  4 4   2010/02/09  1 5   2010/02/13  2 6   2010/02/18  3 状態T 状態連番  項目  1    良好  2    まぁまぁ  3    不良  4    破棄 これからが質問なのですが、 みかんTの連番3の状態が4の場合、状態3のデータ(みかんTでいう連番2,6)は取得したくありません。 そうするには、どう書き換えたらうまく動作するでしょうか・・・ 宜しくお願いいたします。。

  • 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文もご教授いただけますと幸いです。 宜しくお願いいたします。