初めまして。いきなりですが質問させていただきます。
Delphi6+InterBase6で業務アプリケーションを作り、1年前から稼動しています。先日、試験用サーバーにInterBase7(サーバ)をインストールし、現在の業務が
正常に動作するか試してみたのですが、SQL文を発行するところでエラーになる
部分がありました。現行InterBase6にも同じSQL文を発行して詳しく調べてみたところ、どうもInterBaseの集合関数の結果がおかしいようでした。
例えば、現行InterBase6では
SELECT SUM(a),SUM(b) FROM ZDB
というSELECT文を発行したところ、
F_1 F_2
-----------------
55 60
という結果が返ってくるのです。しかし、試験用InterBase7では
SUM SUM1
-----------------
55 60
となります。項目名が違うので、エラーが出るのはあたりまえでした!
ネットなどで調べたところ、どうも後者の結果(SUM,SUM1…)のほうが
正しいようでした。何かInterBaseの設定を知らないうちにいじって
しまったのか、関数「SUM」と「AVG」だけ、結果の項目名が「F_1,F_2…」と
なってしまうようです。それが正しいと思っていたので、なんとか元の結果が
出るようにしたいのですが、どなたか同様の現象で悩んだ方、いらっしゃいませんか?
うちのさん こんにちは。
明確に 項目名をつける癖をつけられれば 回避できることだと思います。
F_1 F_2でほしいのであれば、
SELECT SUM(a) as F_1,SUM(b) as F_2 FROM ZDB
とすれば如何でしょう?
PS.
インターベースは触ったこないので 未検証ですが
AYさん、素早いレスありがとうございます。
なるほど、そうやって as でエイリアス名をつけられるのですね。
しかし、asを使わずに、逆の(おそらく標準であると思われる)「SUM,SUM1…」という
結果が得たいのです。これは、SQL構文の話ではなく、InterBaseの
設定如何ではないかと思うのです。
InterBase6,InterBase7どちらのIBConsoleで同じSQL文発行しても、
違う結果が返ってくるというのは、今後開発する上でも原因を知って
おかなければならないと思いますので…。
集合関数を使って、暗示的に得られる項目名は、それぞれ変わってきます。
Aliasを使うのが正しいSQLの構文になります。もしくは項目番号で扱うことになります。
>InterBase6,InterBase7どちらのIBConsoleで同じSQL文発行しても、
>違う結果が返ってくるというのは、今後開発する上でも原因を知って
>おかなければならないと思いますので…。
結果は同じですよね、列名を指定していないために暗黙についた名称の
原因を探る事に 意味は無いと思いますが・・
DBが変われば全く違いますし、今回のようにバージョンでも起き得るかもしれませんし・・
HOtaさん、AYさん、ありがとうございます。
エイリアス名をつけるのが正しいんですね。
今後そのように致します。
何しろ独学で手探り手探りプログラムを組んでいるものですから、
正しい構文が書けてなかったみたいです。
どうもありがとうございました。
<< 解決 >>
ツイート | ![]() |