• ベストアンサー

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

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

  • ベストアンサー
  • uratan
  • ベストアンサー率30% (38/124)
回答No.4

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

snowsaab
質問者

お礼

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

その他の回答 (4)

  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.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文で、入れ替えできますが如何でしょうか?

snowsaab
質問者

お礼

#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

  • uratan
  • ベストアンサー率30% (38/124)
回答No.3

#1です。 ちょっと認識がちがっていましたね。すいません。(^_^ゞ お聞きしたいのですが「優先度」は上がるだけではなくて、下げたりもするってことですか? なかなかややこしい処理ですねぇ。 もちっと考えて、出直してきまっす。

  • baboooo
  • ベストアンサー率35% (17/48)
回答No.2

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

snowsaab
質問者

補足

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

  • uratan
  • ベストアンサー率30% (38/124)
回答No.1

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

snowsaab
質問者

補足

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

関連するQ&A