• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数updateする時に・・・)

複数updateする方法とは?

selenityの回答

  • ベストアンサー
  • selenity
  • ベストアンサー率41% (324/772)
回答No.1

ご想像通り、無理です。 ストアドプロシージャで解決できます。(多分) ただし、Primary Keyフィールドも必要でしょう。 まずMAX値を取得しておきます。 これを変数か何かにキープしておきましょう。 DECLARE cursor_id INTEGER; SELECT MAX(data) INTO cursor_id FROM sample 以下のSELECT文で変更対象となるデータのidの値に カーソルをセットし、カーソル末尾までFETCHし、 繰返します。 DECLARE c1 CURSOR FOR SELECT id FROM sample WHERE data=0 AND key=A; 繰り返す際に、 OPEN c1; FETCH c1 INTO cursor_id; WHILE cursor_id DO UPDATE sample SET data=max_val+1 WHERE id = cursor_id; FETCH c1 INTO cursor_id; SET max_val = max_val + 1; END WHILE; CLOSE c1; とやればできるのではないでしょうか? P.S. postgresで試していないので、エラーがでます。 およそこんな感じということで、、、

chopin22
質問者

お礼

そうですね・・・。 ストアド(PostgreSQLだとPL/pgSQLかな・・・)にするかどうかは検討します。CGIから呼ぶのでプログラムの中でも出来るので。 有難うございました

関連するQ&A

  • SQLで複数のテーブルと結合したUPDATE文

    普通のUPDATE文はUPDATEするテーブル名を一つ記入して UPDATE テーブルA SET フィールドA = 値A WHERE テーブルA.フィールドB = 値B みたいな感じですが、私のしたい事はと言うと UPDATE テーブルA,テーブルB,テーブルC SET A.フィールドA = 値A WHERE テーブルA.フィールドA = テーブルB.フィールドB AND テーブルB.フィールドB = テーブルC.フィールドC AND テーブルB.フィールドD = 値D AND テーブルC.フィールドE = 値E という具合に複数のテーブルがUPDATEするテーブルA以外のところで、互いに条件で結ばれており、FROM句でUPDATEしないテーブル名まで宣言しないといけなくなっています。そもそもこういうFROM句を使うUPDATE文は実行可能かも不明です。どなたか解決策お願いいたします。ちなみに開発ソフトはVBAを使っています。

  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75

  • UPDATEが動いたり止まったり…

    SQLServer2000SP4の環境で、 夜間バッチ処理で update テーブルA set 項目A1 = (select 項目B1 from テーブルB where 項目B2 = 項目A2) where 項目A2 in( select 項目A2 from テーブルA left outer join テーブルB on 項目A2 = 項目B2 where 項目A1 <> 項目B1 ) という処理で、テーブルAとテーブルBの項目1という値が違うものだけ対象にして、テーブルBの項目1をテーブルAの項目1にセットしています。 この処理で正常に終わることがほとんどなのですが、月に2度程、このコマンドのまま停止した状態(エラーなし。コマンドタイムアウトは0にしています)になることがあります。 きっかけとしては、テーブルAのA1にインデックスを設けたということがあり、エラー対策としてインデックスデフラグを処理直前にかけていました。いっときは正常に動いていたのですが、また停止したので、インデックスフラグメントが原因ではなさそうです。(ちなみにこのUPDATEで更新される件数は数十件です) テーブルA:100万レコード程 主キー:項目A2 インデックス:項目A1 テーブルB:100万レコード程 主キー:項目B2 エラーメッセージも何もでなくて、処理が継続中のような状態で止まっているのでこのUPDATE一文でインデックス更新にロックが掛かっているのかなと勝手に想定はしておりますが、どなたか原因と回避を教えていただきたく質問させて頂きました。よろしくお願いいたします。

  • 複雑なUPDATE文2

    先に質問をさせていただき、1度は解決したものの再び行き詰ってしまいました。 UPDATEの際うまくいかず困っています。 お知恵を拝借いただけると助かります。 使用バージョンはPostgresV7.3.4です。 tableA a1|a2|b|c -+--+-+- 1 | 1 | 1| 1 (★) 1 | 1 | 0| 1 1 | 2 | 0| 1 2 | 2 | 1| 0 2 | 1 | 0| 1 3 | 2 | 1| 1 (★) 3 | 2 | 0| 1 3 | 1 | 0| 1 b=1 and c=1 で一致する行を★行とする。 ★行のa1列の値とa2列の値(上記の例だと(a1=1,a2=1)と(a1=3,a2=1))をもつ行に対して 下記の条件◆でUPDATEを行う。 [条件◆] b=0 and c=1 [UPDATEの内容] 条件◆に一致したc列を3に更新する [理想の結果] tableA a1|a2|b|c -+--+-+- 1 | 1 | 1| 1 1 | 1 | 0| 3 ←更新 1 | 2 | 0| 1 2 | 2 | 1| 0 2 | 1 | 0| 1 ←★にあてはまらないので更新されない 3 | 2 | 1| 1 3 | 2 | 0| 3 ←更新 3 | 1 | 0| 1 ←最下行 ========================================== UPDATE tableA set c = 3 WHERE 条件◆ and a1 in (select a1 from tableA where b=1 and c=1) and a2 in (select a1 from tableA where b=1 and c=1) このようなイメージなのですが、この場合、 最下行のc列も更新してしまいました。 (説明しずらいのですが、) a1とa2の条件は独立させるのでは無く、セットとして考えたいのですが、 方法が分りません。 ご協力お願いします。 ==========================================

  • SQLのUPDATEで文字列の1桁目を置換えたい。

    更新SQLを以下のように作ってみましたが、DBのレコードの文字列の1ケタ目を更新できない。 例) UPDATE テーブル名 SET  STUFF(A-CH,1,1,'1') WHERE B-CH = '1' AND C-CH <> B-CH AND A-CH > ’099999’ ※WHERE以降の条件に該当するものに対し、Aテーブルの1ケタ目を更新したいのですが うまくいきません。 お願いします。

  • SQL文の処理速度向上策について

    はじめまして 当方、初心者で勉強の身です。ご回答頂けたら幸いです。 3つのテーブルから下記条件の項目を取得したのですが どうにも処理速度が遅く困っております。 副問い合わせなどを使い、速度向上を図りたいのですが 良い案はありませんでしょうか。 <テーブル>テーブル名(項目1,項目2・・・) (1)music(項目1~20)総レコード数1万件 (2)data(項目1~12)総レコード数6万件 (3)inside(項目1~18)総レコード数4万件 3テーブルとも3つの同一項目のKeyで構成されています。 <条件> 今日追加された(1)テーブルのレコードの中で(2)、(3)のテーブル両方ともに存在しないレコードを取得すること。(比較項目は3つのKeyのみ) ちなみに現在のSQLは以下の用になっています。 select DISTINCT a.1, a.2, a.3 (3つともKey項目です。) from music a, data b, inside c where a.4 = 20091118 (該当レコードは10件程度です。) and a.1 != b.1 and a.1 != c.1 and a.2 != b.2 and a.2 != c.2 and a.3 != b.3 and a.3 != c.3 結果として出力されるレコードは5件程度です。 以上です。よろしくお願い致します。

  • なければInsert、あればUpdate …ってできますか?

    MySQL 3.23.49-nt を使用中です。 とあるテーブルを、3つのサーバで使用中で、このテーブルを一つのサーバで更新して、他のサーバへ レコードをコピーしたいのですが、「他のサーバ」に既に同じキーの レコードが存在する可能性があります。 こちらで更新したいサーバ(A)のテーブルの内容をこんな感じだとします。 キー番号 | SEQ | 項目A | 項目B ---------+-----+-------+------ 1001 | 1 | 11-AA | 11-BB 1001 | 2 | 12-AA | 12-BB 1002 | 1 | 21-AA | 21-BB 1002 | 2 | 22-AA | そして、コピー先のサーバ(B)のテーブルの内容をこんな感じだとします。 キー番号 | SEQ | 項目A | 項目B ---------+-----+-------+------ 1001 | 1 | 11-BA | 11-XX 1002 | 1 | 21-BA | 21-YY 1002 | 2 | | 22-YY 「キー番号」「SEQ」「項目A」だけを、サーバAと同一にしたいと考えています。 キー番号とSEQが同一のレコードが存在する場合、サーバBの「項目B」は変えたく ありません。 すなわち、サーバ(B)が キー番号 | SEQ | 項目A | 項目B ---------+-----+-------+------ 1001 | 1 | 11-AA | 11-XX ---- 項目Aを更新 1001 | 2 | 12-AA | ---- レコードをINSERT 1002 | 1 | 21-AA | 21-YY ---- 項目Aを更新 1002 | 2 | 22-AA | 22-YY ---- 項目Aを更新 のようになって欲しいのです。 そこで、 「キー番号="1001"、SEQ = "1" のレコードがあれば、そのレコードの項目Aに'11-AA'をセットしてUPDATE。 レコードがなければ、キー番号="1001"、SEQ = "1"、項目A='11-AA'のレコードをINSERT。」 というようなMySQLの命令文(?)を書けないかなぁ?と、一生懸命参考書をひっくり返してもがいています。 できるようなできないような... 無理でしょうか?

    • ベストアンサー
    • MySQL
  • 複数テーブルからデータを取り、updateする

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1211685 にも同じような質問があったのですが、同様の処理でうまくupdateされません。分かる方がいらっしゃいましたら教えてください。 今、テーブルが2つ(table1、table2)があり、それぞれ2つのカラム(column1、column2)を持っています。ここで、それぞれのカラム2が等しく、カラム1が指定した値のレコードのみ値をupdateしたいです。 update table1 set column1 = 'AAA' from table1,table2 where table1.column2 = table2.column2 and table1.column1 = 'BBB' and table2.column1 = 'CCC' としたところ、「from table1,table2 where 」の辺りに間違いがあると表示されます。 上の例とどう違うのか分かりません。 よろしくお願いします。m(__)m

  • 複雑なUPDATE文

    少し複雑なUPDATEをしているのですが、うまくいかず困っています。 お知恵を拝借いただけると助かります。 使用バージョンはPostgresV7.3.4です。 tableA a |b |c -+-+- 1 | 1 | 1 (★) 1 | 0 | 1 1 | 0 | 2 2 | 1 | 0 2 | 0 | 1 3 | 1 | 1 (★) 3 | 0 | 1 3 | 0 | 2 b=1 and c=1 で一致する行を★行とする。 ★行のa列の値(上記の例だとa=1,a=3)をもつ行に対して 下記の条件◆でUPDATEを行う。 [条件◆] b=0 and c=1 [UPDATEの内容] 条件◆に一致したc列を3に更新する [理想の結果] tableA a |b |c -+-+- 1 | 1 | 1 1 | 0 | 3 ●更新 1 | 0 | 2 2 | 1 | 0 ←★にあてはまらないので更新されない 2 | 0 | 1 3 | 1 | 1 3 | 0 | 3 ●更新 3 | 0 | 2 ========================================== ★の条件を考えない場合は、下記予想します。 UPDATE tableA set c = 3 WHERE 条件◆ ★の条件を考えた時、どのような条件にすればよいかさっぱり分かりません。 ご協力下さい。 ==========================================

  • updateの一括実行

    SQLに関しまして質問させて頂きます。 更新元テーブルA、マスタテーブルB、更新先テーブルCがあり、 以下のような条件を一つのSQL文で実現したいと思っています。 【条件】 (1)Aのe列が1のものを対象に更新をかける (2)条件(1)を満たすレコードの各所属&氏名をマスタBのIDに置き換え、テーブルCに更新 【テーブルA(更新元)】 ----------------------------------------------- No 所属1 氏名1 所属2 氏名2 所属3 氏名3 e 01 A01  ああ  A01  いい  C01  おお 1 02 A01  いい  A01  うう  C01  おお 0 03 B01  ああ  B01  ええ  C01  おお 1 ----------------------------------------------- 【テーブルB(マスタ)】 ----------------- ID  所属 氏名 001  A01  ああ 002  A01  いい 003  B01  ああ : ----------------- 【テーブルC(更新先)】 ------------------ No ID1 ID2 ID3 01 001 002 025 02 002 003 025 03 011 014 025 ------------------ テーブルAが1レコードであれば update C set ID1=(select ID from A, B where A.所属1=B.所属 AND A.氏名1=B.氏名) ID2=(select ID from A, B where A.所属2=B.所属 AND A.氏名2=B.氏名) ID3=(select ID from A, B where A.所属3=B.所属 AND A.氏名3=B.氏名) where No='01' で行くのですが、10000行の更新で10000回update文を発行すると処理に時間がかかります。 そこで、updateの一括実行を行いたいと考えています。 ご存知の方がいらしましたら、 ご教授よろしくお願い致しますm(_ _)m 【環境】 oracle 9i