[pgsql-jp: 32675] Re: テーブルとつき合わせるupdate文の事で質問

TANIDA Yutaka tanida @ sra.co.jp
2004年 4月 6日 (火) 13:23:43 JST


谷田です。

On Tue, 06 Apr 2004 11:59:39 +0900
西村 篤史 <atsushi_nishimura @ lets-heart.co.jp> wrote:


> UPDATE m_商品
> SET
>  企画価格 = T_企画.企画価格 ,
>  企画期間自 = t_企画.期間自 ,
>  企画期間至 = t_企画.期間至 ,
>  更新日時 = current_timestamp
> from
>  t_企画
> where
>  (m_商品.商品コード = t_企画.商品コード);

> 商品コード「1001」なる商品について、T_企画には2つあるとします。
(snip)
> update 文を実行したのですが、03年12月の日付になっている内容しか
> m_商品へ更新されませんでした。1回は03年12月の内容に更新され、さらに04年01月の
> 内容に更新されると思っていたのですが...

うーん、私の知識ではこのSQL文においてT_企画テーブルに複数の行が該当する
ときにどのような結果を返すべきなのか、というのは分かりません。

少なくともSQLにおいて順序というのものは指定しない限り不定なので、仮に二
度書き換えられたところで、望むような動作は保証されません。

# 一回目に4年の内容に、二回目に3年の内容に書き換えられることがある

であるからして、このSQLの結果は不定である、と言う事になります。また、1
度しか書き換えられない場合でも不定なのは同じです。

じゃあorder byすればいい、という話もあるのですが、それは違うような気がし
ます。例えば、以下のSQLは今回の条件のみを考えた場合はお望みの結果を返す
と思うのですが・・・

UPDATE m_商品
SET
 企画価格 = T_企画.企画価格 ,
 企画期間自 = t_企画.期間自 ,
 企画期間至 = t_企画.期間至 ,
 更新日時 = current_timestamp
from
 (select * from t_企画 order by 期間自 desc)
where
 (m_商品.商品コード = t_企画.商品コード);

個人的にはこの要件を考えるに、期間をwhere句に指定して、update対象を明確
に絞り込むのが唯一の正しい選択肢だと思います。

-- 
TANIDA Yutaka <tanida @ sra.co.jp>




pgsql-jp メーリングリストの案内