- 締切済み
SQLでの行の交換の仕方について質問です。
SQLで、UPDATE文を使って行を交換したいのですが、例えばこのようなテーブルがあった時 No Name Qty -- ----- ----- 1 皿 10 2 串 20 3 本 30 No1とNo2のQtyを入れ替えたいとき、Tmpのような所に一旦退避させて交換するような 方法以外で、入れ替える方法はありますか?
- who_ray_sis
- お礼率17% (15/87)
- Oracle
- 回答数3
- ありがとう数1
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- root139
- ベストアンサー率60% (488/809)
単一の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 句は不要です。
- yamada_g
- ベストアンサー率68% (258/374)
ちょっと無理やり感がありますが、 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)
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
- 締切済み
- Oracle
- 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
- ベストアンサー
- Oracle
- 行と列の入れ替え検索(行は可変で項目を固定にしたい)の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つにする』というようなことはできないものでしょうか?
- ベストアンサー
- Microsoft ASP
- 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