カテゴリー別アーカイブ: db

update-select文とupdate-for文について

SQLでもっともつまづきやすいupdate-select文というものがある。

select文による結果でupdateするが、その正しいやり方というのを見ると、おそらく誰もが気持ち悪いと思うはず。

SELECT結果でのUPDATE
qa.atmarkit.co.jp/q/98

setでデータを入れるサブクエリ内のSELECT文のwhere句ではなく、updateの更新対象を絞り込むUPDATEのwhere句をしっかり定義しないと、思った通りに動かないことがある...そして、サブクエリ内のwhere句の条件とupdate文のwhere句の条件は往々にして同じような条件になるため、SQLの文法を知らない人が見ると「何で同じような定義を2回しているんだ?」という疑問を持つことになる。更新先の絞り込みをしないと更新元がない時に問題を起こすので、同じような条件を指定しているのだ。これを解決する手段としてpostgresとしてはupdate文にfor文を連結して更新対象と更新結果を出力するselect文を書くことができる。これによりupdate文にselect文のサブクエリを連結せずにスムーズにデータ挿入することが可能になる。

adodb::[-1: Missing extension for postgres] in CONNECT(localhost, ‘*****’, ‘****’, ‘*****’);

接続情報は確かにあっているはずなのに以下のエラーが出てポスグレに接続できない…。

[-1: Missing extension for postgres] in CONNECT(localhost, '*****', '****', '*****');

phpのExtensionが足りないから。

だそうですけど、具体的にどれ?というわけでもないので、、、

yumで見つけた

「php-pgsql.x86_64 5.3.3-46.el6_6」

をインストールしてWebサーバを再起動して読み込ませたら正常にpostgreSqlサーバに接続できました。

[SQL]特定のテーブルの特定のカラムをn倍する方法

以下のSQLでうまくいった。

update m_table
set col1 =
(select (b.col1 * 10) s10
from m_table b
where m_table.id = b.id
);

もっとうまい方法があるのかもしれないが、
SQLだけで集計計算する方法を模索していて、
思いついたselect-update文の1つ。

各レコードにIDが振られている前提で書いている。

IDが無いならば別の方法をとらないといけないかも。