こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQLの同時実行

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つにする』というようなことはできないものでしょうか?

投稿日時 - 2002-12-02 11:57:52

QNo.418257

すぐに回答ほしいです

質問者が選んだベストアンサー

ちょっと思ったのですが、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 項目名 = 'うう'

でどうでしょう??

投稿日時 - 2002-12-02 15:55:58

お礼

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

投稿日時 - 2002-12-03 09:37:01

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

プログラミングでする、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文で、入れ替えできますが如何でしょうか?

投稿日時 - 2002-12-02 19:00:18

お礼

#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:10

ANo.3

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

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

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

投稿日時 - 2002-12-02 15:37:09

ANo.2

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

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

投稿日時 - 2002-12-02 12:39:27

補足

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

投稿日時 - 2002-12-02 13:16:44

ANo.1

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

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

投稿日時 - 2002-12-02 12:16:33

補足

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

投稿日時 - 2002-12-02 13:03:47

あなたにオススメの質問