アプリ版:「スタンプのみでお礼する」機能のリリースについて

SQL文について質問なんですが、下記のようなテーブルがあった場合に『2を3に、3を2にする』というクエリを作ってみましたが、どうもうまくいきません。

┌─┬──┐
│No│項目│
├-┼──┤
│1│ああ│
├─┼──┤
│2│いい│
├─┼──┤
│3│うう│
└─┴──┘

strSQL1=UPDATE テーブル名 SET No = '2' WHERE No = '3'
strSQL2=UPDATE テーブル名 SET No = '3' WHERE No = '2'

これをASPから実行する場合は
cn.Execute(strSQL1)
cn.Execute(strSQL2)
とすると、先にstrSQL1が実行されテーブルが更新された後にstrSQL2が実行される
ため、
┌─┬──┐
│No│項目│
├─┼──┤
│1│ああ│
├─┼──┤
│3│いい│
├─┼──┤
│3│うう│
└─┴──┘
となってしまいます。『2つの更新を同時に実行させる』もしくは『2つの更新クエリ1つにする』というようなことはできないものでしょうか?

A 回答 (5件)

ちょっと思ったのですが、WHERE文でNoを指定しない方がいいのでは??


フィールドが2つで、項目がユニークでなければ、Noと項目をWHERE条件にしたほう
がいいではないでしょうか?

んでもって、優先度を上げるときは、演算で[+1]とし、下げるときは[-1]でいいのでは?

例えば・・・
(1)優先度を上げるとき
strSQL1=UPDATE テーブル名 SET No = NO + 1 WHERE No = '3' AND 項目名 = 'いい'

(2)優先度を下げるとき
strSQL2=UPDATE テーブル名 SET No = NO - 1 WHERE No = '2' AND 項目名 = 'うう'

でどうでしょう??
    • good
    • 0
この回答へのお礼

そうなんです。
優先度の上げ下げがありますので、優先度を上げるときは(数値は小さくするので)[-1]、下げるときは(数値は大きくするので)[+1]をしました。
なおかつ、Noと項目をWHERE句にしました。
それと、#1で教えて頂いたテンポラリを使っての方法もとりいれて、
期待通りの動作をさせることができました。
ありがとうございましたm(__)m

お礼日時:2002/12/03 09:37

プログラミングでする、SWAP方式でいいのではないのでしょうか。



1 ああ
2 いい←(1)
3 うう←(2)

90 んん

(1)の番号を最終番号(ここでは90とします)の次にして
1 ああ
91 いい←(1)
3 うう←(2)

90 んん

(2)の番号を目的の番号に変更して
1 ああ
91 いい←(1)
2 うう←(2)

90 んん

(1)を入れ替え番号にすれば、完了。
1 ああ
3 いい←(1)
2 うう←(2)

90 んん

3回のUPDATE文で、入れ替えできますが如何でしょうか?
    • good
    • 0
この回答へのお礼

#1のuratanさんのテンポラリーデータを入れて変数の入れ替えみたいにするのですね。

UPDATE テーブル名 SET No = 'Temp' WHERE No = '3'
UPDATE テーブル名 SET No = '3' WHERE No = '2'
UPDATE テーブル名 SET No = '2' WHERE No = 'Temp'

この3回のUPDATE文で解決することができました。
ありがとうございましたm(__)m

お礼日時:2002/12/03 09:44

#1です。


ちょっと認識がちがっていましたね。すいません。(^_^ゞ

お聞きしたいのですが「優先度」は上がるだけではなくて、下げたりもするってことですか?

なかなかややこしい処理ですねぇ。
もちっと考えて、出直してきまっす。
    • good
    • 0

2と3だけでよいのでしょうか?


計算式を入れるのではダメですかね?
6÷2=3、6÷3=2を利用して以下のように。
(Noは文字列に変換する必要があるかもしれませんが)

strSQL1=UPDATE テーブル名
SET No = 6/No
WHERE No = '2' OR No = '3'

この回答への補足

2と3だけではないのです。
Noはいくつまであるかわからないし、どのNoを選ばれるのかもわからない状態なので、固定の条件を書くわけにはいかないのです。

補足日時:2002/12/02 13:16
    • good
    • 0

データをひっくり返したいということですよね。


どうして、その必要が生じてしまったか気になる所ですが、
どちらかのSETで、テンポラリデータを入れておくっていうのはどうでしょうか?
たぶんデータ型は数値ですよね。
だからユニークな数値を決めて、3回目のExecuteで、正しい値を入れると・・・。

なんかCのポインタ交換みたいですけどね。(^_^ゞ

この回答への補足

データをひっくり返したいというか・・・。
このテーブルは優先度高い順(優先度をわかりやすくするためにNoという名前のフィールドにしました。)に並んでいて
あるレコードを選択した場合、そのレコードの優先度を上げるために、そのレコードの優先度とひとつ上のレコードの優先度を入れ替えたいのです。
どのレコードかという情報は既に取得できているので、あとはその情報を元にクエリを作成して、実行するだけなのです。

補足日時:2002/12/02 13:03
    • good
    • 0

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