• 締切済み

SQLでの行の交換の仕方について質問です。

SQLで、UPDATE文を使って行を交換したいのですが、例えばこのようなテーブルがあった時 No Name Qty -- ----- ----- 1  皿 10 2  串 20 3  本 30 No1とNo2のQtyを入れ替えたいとき、Tmpのような所に一旦退避させて交換するような 方法以外で、入れ替える方法はありますか?

  • Oracle
  • 回答数3
  • ありがとう数1

みんなの回答

  • root139
  • ベストアンサー率60% (488/809)
回答No.3

単一のSQLでやりたいなら、CASE式とスカラサブクエリの組合せでいけるのではないかと。 なお、手元に環境が無いので Oracle では未確認です。 UPDATE table_hoge SET Qty = CASE No WHEN 1 THEN (SELECT Qty FROM table_hoge WHERE No = 2) WHEN 2 THEN (SELECT Qty FROM table_hoge WHERE No = 1) ELSE Qty END WHERE No IN (1, 2); 性能などを気にしないなら、最後の WHERE 句は不要です。

参考URL:
http://www.geocities.jp/mickindex/database/db_case.html#LocalLink-update
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

ちょっと無理やり感がありますが、 update テーブル T1 set Qty = ( select Qty from テーブル T2 where T2.No = case T1.No when 1 then 2 when 2 then 1 else T1.No end ) where T1.No in (1, 2) ; こんなのとか。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

1に2を加える(30,20) 1から2を引き2とする(30,10) 1から2を引き1とする(20,10)

関連するQ&A

  • SQLについて

    こんにちは、honiyonです。  良い質問タイトルが思いつきませんでした...(^^;  2つのテーブルがあります。(仮定です)   ・オーナーの情報テーブル(owner)   ・オーナーの車の情報テーブル(car)  この2つのテーブルを利用して「男性の人で、黒い車に乗ってる人の車種名」を検索しようとしました。  これを1つのSQLで   SELECT car.name FROM owner,car WHERE (owner.no=car.ownerno) and (car.color='black') and (owner.sex='MAN');  とか、   SELECT car.name FROM (SELECT * FROM owner WHERE (owner.sex='MAN')) AS O2, (SELECT * FROM car WHERE (car.color='black')) AS C2 WHERE (owner.no=car.ownerno);  とかやってみましたが、涙が出るほど遅いです。  しかし   SELECT * INTO TABLE owner_tmp FROM (SELECT * FROM owner WHERE owner.sex='MAN'); SELECT * INTO TABLE car_tmp FROM (SELECT * FROM car WHERE car.color='black'); SELECT car_tmp.name FROM (owner_tmp.no=car_tmp.ownerno);  とすると超高速です。  なんとかテンポラリを作らず、出来れば1つのSQL文で高速に冒頭の処理を行いたいのですが、良い方法はないでしょうか。 是非お知恵を貸してください。  宜しくお願いします(.. #データベースはPostgreSQL 7.2.3です。

  • 同じ列に2行づつで出力するSQL

    次のようなテーブルがあったとき no | name 1 | aaa 3 | bbb 4 | ccc 6 | ddd (先頭はカラム名です) 以下のように出力するSQLは書けますでしょうか? no1| name1 | no2| name2 1 | aaa | 3 | bbb 4 | ccc | 6 | ddd

  • 最新の行だけを抽出するSQL文

    このジャンルでお願いします。 t1テーブル id name 1  aaa 2  bbb 3  aaa t2テーブル id t1_id num 1  1   10 2  2   100 3  1   1000 4  3   1 このようなテーブル構成で、 t1のnameが「aaa」 かつ t2のidが最新の行だけnumを合計した数値を得たいのですが、 この例だと、 まずt2テーブルの id t1_id num 1  1   10 3  1   1000 4  3   1 が該当して、t2のidが最新の行だけなので id t1_id num 3  1   1000 4  3   1 に絞られて、1000+1で「1001」という結果が得たいのです。 どのようなSQL文にすれば良いのでしょうか?

    • ベストアンサー
    • MySQL
  • SQLの条件式の作成に関して

    PL*SQLを作成しているのですが うまくいかず質問させていたたくことにしました。 SQL初心者ですがよろしければご教示ください。 テーブル名 カラム名 TMP     DATA,TIME LIST     NO,WNO BOOK    SNO,TITLE 上記をふまえた上で DATAへNOをUPDATEかけたいのですが その条件は ・BOOK.SNO=LIST.WNOかつTMP.TIME=LIST.WNOのLIST.NOの抽出 ・TMP.TIME is not null ・BOOK.TITLE is not null ・distinct TMP.DATA ・TMP.DATA is not null 以上です。 どなたかよろしくお願いしますm(_ _)m

  • SQL文について教えてください。

    お世話になります。 テーブルを3つ作りました ユーザーテーブル:USER_MS USE_NO USER_NAME 001   太郎 002   次郎 003   三郎 品名テーブル:HINMEI_MS HINMEI_NO HINMEI_NAME 001    りんご 002    みかん 003    イチゴ 嫌いなものテーブル:KIRAI_TR KIRAI_NO USER_NO HINMEI_NO 001001  001   001 002003  002   003 002001  002   001 ※KIRAI_NO=USER_NO.HINMEI_NO と連結してプライマリーキーにした ここで、次郎の嫌いなものを抽出するときには $USER_NO = '002'; $SQL ="SELECT * FROM KITAI_TR A,HINMEI_MS B WHERE A.USER_NO = '$USER_NO'; で抽出できるのですが、 次郎の嫌いでない002みかんだけを抽出するSQL文がわからず苦慮しています。 以前、オラクルでSQLを使ったことがあったのですが、その時はFROM句の後に(SELECT * FORM・・・・) Bなどと書くと通ったのですがMYSQLでは通りませんでした。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLの書き方

    select A.NO, A.NAME, count(B.TEN) FROM T1 A, T2 B GROUP BY A.NO ORDER BY 3 DESC 結果として以下のようになってほしいのですが、どのようにSQLを書けばよいのでしょうか? 結果 NO | NAME | TEN ---+------+----- 3 + 上村 + 40 1 + 吉田 + 11 2 + 浅野 + 6 T1テーブル NO | NAME ---+-------- 1 + 吉田 2 + 浅野 3 + 上村 T2テーブル NO | TEN ---+-------- 1 + 10 2 + 5 3 + 0 1 + 1 2 + 1 3 + 40

  • 行と列の入れ替え検索(行は可変で項目を固定にしたい)のSQL文が出来な

    行と列の入れ替え検索(行は可変で項目を固定にしたい)のSQL文が出来ない 以下のテーブルがあります。 <テーブルA> UID  name --------------- 1   伊藤 2   鈴木 3   高橋 4   佐藤 <テーブルB> no UID key   value ------------------- 1  1  telno  001-01-0001 2  1  faxno  001-01-0002 3  1  nickname itochan 4  2  telno  111-11-1111 5  2  faxno  111-11-1112 6  3  nickname hashi この2つのテーブルがあります。 ・テーブルAにあるUIDはテーブルBにない場合もあります。 この場合、以下のように出力して、csvファイルにしたいのですが、可能でしょうか? 申し訳ありませんが、よろしくアドバイスお願いいたします。 UID  name  telno    faxno     nickname ------------------------------------------------- 1   伊藤  001-01-0001 001-01-0002  itochan 2   鈴木  111-11-1111 111-11-1112 3   高橋                  hashi 4   佐藤 (経緯:wordpressのユーザの一覧(users,usetmetaテーブル)をユーザ一覧としてCSV形式にして保管したいのです。抽出&登録できるプラグインがなかったので)

    • ベストアンサー
    • MySQL
  • SQLの書き方

    テーブルA CODE NAME ------------- 0001 山田 0002  斎藤 0003 宮下 テーブルB CODE NAME ------------- 0002  斎藤 0004 加藤 上記のテーブA,Bから下のような結果を 返すSQL分を書きたいのですが何かよい方法はないでしょうか? (重複する行は一行として返したいです。) CODE NAME ------------- 0001 山田 0002  斎藤 0003 宮下 0004 加藤

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

  • SQL文を教えてください

    以下のようなテーブルがあります。 IDとnameは複合ユニークキーとなっています。 ID | name 1 | foo 2 | foo 1 | bar 3 | foo 2 | hoge 3 | bar このテーブルから、nameにfooとbar両方を持つIDを抜き出すSQL文が分からずに困っています。 つまり、fooとbarで検索するとID 1とID 3が、fooとhogeで検索するとID 2がヒットするようなSQL文を知りたいのです。 初歩的な質問なのかもしれませんが、どうしてもSQL文が思いつかず大変困っています。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL