PostgreSQL について質問です。

とあるテーブルに、主キーが2つある場合
id, subid で下記のようなUPDATE文を更新したいのですが、どう記述すれば良いのでしょうか?ご教授おねがいします。(相関サブクエリとかでしょうか?)

update
tb1
set
a= a + 1
,b= b + 1
where
id= (select id from tb2 where date > now())
AND subid= (select subid from tb2 where date > now())

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/10/11 11:48:35
  • 終了:2006/10/18 11:50:04

回答(4件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/10/11 12:01:57

ポイント27pt

http://www.postgresql.jp/document/pg734doc/user/ddl-constraints....

主キーが2つというのはありえないので、キーが2つあるもしくは2カラムで主キーという事でしょうか?

http://www.postgresql.jp/document/pg734doc/user/functions-subque...

すいませんがどのような処理が行いたいのかがよく分かりません。

とりあえず文法上は IN を使えば実行可能だと思います。

update tb1
  set a= a + 1 ,b= b + 1
  where
    id IN (select id from tb2 where date > now())
    AND subid IN (select subid from tb2 where date > now())
id:disca

ありがとうございます。

2カラムで主キーです。大変参考になります。

2006/10/11 12:56:03
id:llusall No.2

llusall回答回数505ベストアンサー獲得回数612006/10/11 12:58:18

ポイント27pt

こちらで如何でしょうか?

update
    tb1 t1
set
    t1.a= t1.a + 1
   ,t1.b= t1.b + 1
where
exists (
    select t2.id from tb2 t2
    where t2.date > now()
    and t2.id = t1.id
    and t2.subid = t1.subid
)

EXISTS

id:disca

ありがとうございます、EXISTS という便利なものがあるのを初めて知りました。下記のばあいだと、エラーが表示されます。ERROR: missing FROM-clause entry for table "t2"

-----------

update

tb1 t1

set

t1.a= t1.a + t2.a

,t1.b= t1.b + t2.b

where

exists (

select t2.id from tb2 t2

where t2.date > now()

and t2.id = t1.id

and t2.subid = t1.subid

)

-----------

解決策をご教授いただくことはできますでしょうか?

2006/10/11 15:53:01
id:llusall No.3

llusall回答回数505ベストアンサー獲得回数612006/10/11 16:21:49

ポイント26pt

この質問・回答へのコメントを許可していただけると良かったのですが、

そうでは無いので、再回答させていただきます。

   t1.a= t1.a + t2.a
  ,t1.b= t1.b + t2.b

上記って、

   t1.a= t1.a + 1
  ,t1.b= t1.b + 1

の間違いではないのでしょうか?

このSQL文の方法では、t2.a、t2.b を参照できません。

ですのでエラーになっています。


どうしても、という事であれば、次のようなSQLが考えられるのですが、

未確認な為、動作はわかりません。

すみません。

update
  tb1 t1
set
   t1.a= t1.a + (
      select t2x.a from tb2 t2x
      where t2x.date > now()
      and t2x.id = t1.id
      and t2x.subid = t1.subid
   )
  ,t1.b= t1.b + (
      select t2y.b from tb2 t2y
      where t2y.date > now()
      and t2y.id = t1.id
      and t2y.subid = t1.subid
  )
where
exists (
  select t2.id from tb2 t2
  where t2.date > now()
  and t2.id = t1.id
  and t2.subid = t1.subid
)

id:disca

ご回答ありがとうございます。

説明不足でした、実際のところは

t1.a= t1.a + t2.a

,t1.b= t1.b + t2.b

このような事をしていました。とても勉強になりますが、上記のSQLのばあいですと、地道に Select した結果をPHPで作成した変数に代入して update したほうが良さそうですね。

2006/10/11 17:11:42

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 kurukuru-neko 1844 1736 155 2006-10-11 22:01:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません