やりたい事:
複数レコードのある項目を1度にupdateたい。
現在のA項目の最大値に+1した値から順にインクリメントした値を入れたい。

例: sampleというテーブルにkey,dataという項目があったとします。
update前 >>> update後
key|data______key|data
--+----______--+----
_A_|_1___________A_|_1_
_B_|_2___________B_|_2_
_C_|_3___________C_|_3_
_A_|_0___________A_|_4_
_A_|_0___________A_|_5_
_A_|_0___________A_|_6_

(スペースが入らなくて_にしました見にくいですが)

同じ値をupdateするなら
update sample set data=値 where key=A and data=0
これを
update sample set data=MAX(data)++ where key=A and data=0
みたいに書けたらいいなぁと思うのですが、1度該当レコードをselectして取得した値を条件に順番に1行づつupdateしないとだめですかね・・・

ちなみに環境はRedHat7.0J上のPostgreSQL7.0.2 です。

このQ&Aに関連する最新のQ&A

A 回答 (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で試していないので、エラーがでます。
およそこんな感じということで、、、
    • good
    • 0
この回答へのお礼

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

有難うございました

お礼日時:2001/06/08 09:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

QSQLiteで「UPDATE table1 SET cnt+=1」のようなことがしたいのですがどう書けばいいですか?

adobe AirにてSQLiteを使っています。

ある値を加算してやりたいのですがmySQLと同じ書き方ではできませんでした。下の2つの書き方はいずれもだめでした。
UPDATE table1 SET cnt+=1
UPDATE table1 SET cnt=cnt+1

どのように書けばいいのでしょうか?
よろしくおねがいします。

Aベストアンサー

SQLの基本的な構文であり、MySQLとは違うといったことはありません。

update 表名 set 列名=列名+1

>mySQLと同じ書き方ではできませんでした。下の2つの書き方はいずれもだめでした。

「だめ」とは、具体的にどうなるのですか?
文法エラー?
更新しているはずなのに、値が変わっていない?

QUPDATE時のSETの実行順について

MySQLで
  UPDATE data SET item1=item2, item2=0;
と書いた場合、item1にはそれまでのitem2の値が入り、item2は0になりました。

また、
  UPDATE data SET item2=0, item1=item2;
と書いた場合、item1、item2ともに0になりました。

これは「SETの内容は、書いた順に実行されることが保証されている」と考えてよいのでしょうか?
それとも実装依存なのでしょうか?

Aベストアンサー

マニュアルに

mysql> UPDATE persondata SET age=age*2, age=age+1;
UPDATE は左から右へ評価されます。

とありますので、書いた順に実行されるということだと思います。
http://dev.mysql.com/doc/mysql/ja/UPDATE.html#IDX1545

参考URL:http://dev.mysql.com/doc/mysql/ja/UPDATE.html#IDX1545

QUPDATE文のsetに複数処理

access2002でSQLで書いています。
とある文章のアタマとお尻をチョンぎって、真ん中だけ抜き出すようにしたいのですが

UPDATE [A表] SET [A表].F1 = Mid([F1],32);

UPDATE [A表] SET [A表].F1 = Left([F1],Len([F1])-20);

と2クエリになっています。これを1つにすることは可能ですか?出来るはずだとは思うのですが・・・。
OracleSilver10g所有者なんですけど5年以上やってないと基礎的なところまで
スッカリサッパリ忘れてしまっていて本当に歯がゆい感じで困ってます。
ちょっとやれば思い出せるだろうとナメていました。UPDATEすらgoogleに頼るまで忘れてました。

Aベストアンサー

可能ですが、先頭32文字と末尾20文字を切り捨てるからには、
元のデータは必ず52文字以上あるんですかね?

UPDATE [A表] SET [A表].F1 = iif( len([F1]) > 52, mid([F1], 33, len([F1]) - 32 - 20), '');
F1列が52字を越えていれば途中を切り出し、52文字以下なら空文字をセットします。
ELSE部分は適宜変更してください。

QAccess_VBA_記述方法

AccessVBAの記述方法で悩んでいます。
複数のテーブルを順読みして、レコードの更新/追加/削除のプログラムを作成していますが、順読みなので何も入っていないテーブルのレコードも読みに行ってしまいデバックとして出てしまいます。
EOFやNULLをどうにかして判断条件として記述してみましたが、やはり上手くいきませんでした。
レコードでの判断条件では無く、テーブル内にレコードが存在するかどうかという判断文と条件文の記述方法がありましたら、どうか教えて下さい。
宜しくお願い致します。

Aベストアンサー

○案1
Dim cnt
cnt = Dcount("*", "[テーブル名]")
If cnt > 0 Then
' レコードがあるテーブルになにかする
End If

とDcount関数を使えばどうでしょうか。

○案2
また複数のテーブルが同じフィールドを含むならば
ユニオンクエリで1つのテーブルにしてから扱うことも
簡単だと思います。

Q【Access抽出方法】 表A-表B=表C は?

Accessを使って2つの表からデータを抽出する方法を
教えてください。

やりたいことは引き算です。
 表A - 表B = 表C

表Aには全取引会社がリストとして入っています。
表Bには得意先の会社だけが入っています。
表Aの中に入っている会社から表Bの得意先以外の
会社だけを表Cとして出したいのですが、
どうするのでしょうか?

実は今、これを手作業で1つ1つ検索削除をやってます。
どなたかお助けください!

Aベストアンサー

テーブルが取引先と得意先
キーが会社CDとすると

SELECT 取引先.*
FROM 取引先 LEFT JOIN 得意先 ON 取引先.CD = 得意先.CD
WHERE (得意先.CD) Is Null;

取引先全レコードと得意先レコードをキーで結びつけて
そのうち得意先レコードがない(null)のレコードを選択する。


このカテゴリの人気Q&Aランキング

おすすめ情報