- 締切済み
Select文を含むUpdateの記述方法を教えて下さい。
支払済の、円とドルの合計を求めて、それを記録したい場合。 update `table2` set (paidyen,paiddol) = (select sum(yen),sum(dol) from `table` where `paid` = '支払済') と記述は出来ないのでしょうか? update `table2` set paidyen = (select sum(yen) from `table` where `paid` = '支払済'), paiddol = (select sum(dol) from `table` where `paid` = '支払済') だと動作するのですが無駄な記述が多いような。 簡潔に出来る方法はありますか? ご存知の方教えてください。
- taaaaaaa
- お礼率40% (45/111)
- MySQL
- 回答数2
- ありがとう数0
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- castoff
- ベストアンサー率15% (7/46)
そもそもDBはなんですか? Oracle SQLServer MySQL 等など DBによってSQL文は違ってきますよ。
- yambejp
- ベストアンサー率51% (3827/7415)
バージョンはいくつでしょうか? サブクエリを使っているので大丈夫だとは思いますが 4.0.4以降であればjoinを使ったアップデートが可能です。 http://dev.mysql.com/doc/refman/4.1/ja/update.html
関連するQ&A
- SELECTを含むUPDATEについて
2つののテーブルがあり、テーブル1のデータを元にテーブル2を更新させたい場合、SELECT文を含むUPDATE文で更新出来ると思うのですが、どのようにしたら一番効率的でしょうか? 例)テーブル1~table1 no ken city ---------------------------------- 01 北海道 根室 03 青森 八戸 05 千葉 柏 08 埼玉 さいたま 09 東京 千代田区 例)テーブル2~table2 no ken city ---------------------------------- 01 02 03 04 05 06 07 08 09 テーブルが2つあり、テーブル1の情報を元にテーブル2を更新したい。 条件は、noが一致していること。 A) kenを更新するには、 ↓ UPDATE `table2` SET ken = (SELECT ken from table1 WHERE table1.no = table2.no) B) kenとcityを更新するには、 ↓ UPDATE `table2` SET ken = (SELECT ken from table1 WHERE table1.no = table2.no), city = (SELECT city from table1 WHERE table1.no = table2.no) SELECT以下が同じなのでもうちょっとスマートに短く記述する方法はあるんでしょうか?
- ベストアンサー
- MySQL
- SQLserverでのUPDATE文について
SQLserverで下記のようにテーブルがある場合、 TABLE_Bの単価をTABLE_Aの単価にセットしたい場合、 どのようにUPDATE文を記述すればよいでしょうか? TABLE_A 商品 色 単価 数量 備考 TABLE_B 商品 色 単価 条件:商品と色が一致するもの TABLE_Bには重複データは無いものとする。 クエリーアナライザーで下記のように記述すると エラー「列名が無効です」となりました。 UPDATE TABLE_A SET TABLE_A.単価 = (select TABLE_B.単価 from TABLE_B where TABLE_A.商品 = TABLE_B.商品 and TABLE_A.色 = TABLE_B.色) どのような記述をすれば良いのでしょうか?
- ベストアンサー
- SQL Server
- UPDATE文(副問合せ?)について
うまく説明できないのですが、下記のようなテーブルがあります。 テーブル名:A 項目: A1 A2 A3 A4 AテーブルのA1項目に「5」がセットされているデータについて、 A2に123、A3に321をセットしたいのです。 うまくいかない例ですが、下記のようなイメージです。 UPDATE A set A2=123,A3=321 FROM (SELECT * FROM A WHERE A1 = '5') ちなみに下の書き方はダメです。 「SELECT * FROM A WHERE A1 = 5」の部分は、必ず使用し、変更不可です。 × UPDATE A set A2=123,A3=321 WHERE A1 IN(SELECT A1 FROM A WHERE A1 = 5) 変な質問ですいませんが、何か方法があるのでしょうか。 よろしくお願いします。
- 締切済み
- SQL Server
- Select文とデッドロックについて
現在のような処理をしています。 SQL Server2008 R2 Expless プログラム1 select count(*) from TABLE_A プログラム2 BeginTrance SERIALIZABLE select count(*) from TABLE_A Update TABLE_B set F1=123 Where P1=1 Commit ※ここで P1はTABLE_Bのプライマリキーとします。 この2つのプログラムを同時に実行している時に、プログラム1のSELECT文でデッドロックが発生した との連絡ありました。 プログラム2でもエラーが発生しているのかもしれませんが、現状調査不可能為不明です。 いろいろデッドロック、ロックヒントなどいろいろ調べてみた結果、なんとなく発生するかも?とは思われますが、このような場合、本当にデッドロックが発生するのでしょうか? また、発生する場合には、何と何がデッドロックになっているのでしょうか? (発生するはずがないとなると調査する視点を変えてみます。) よろしくお願いします。
- 締切済み
- SQL Server
- SELECT文の二段重ね
次のSQL文を実行します。 create table1 (id, english) insert table1 (1,"foo") insert table1 (2,"bar") create table2 (id, japanese) insert table2 (1, "ふー") insert table2 (2, "ばー") SQL文法としては誤ってますが、成功したとします。 いま、select id from table1 where english = 'foo'; で1が得られます。 いま、select japanese from table2 where id = 1; で"ふー"が得られます。 これを一つのSQLite3のselect文で実現できないでしょうか。 select japanese from table2 where id = (select id from table1 where english = 'foo'); で良いですか? カテゴリ選択にSQLiteが無いのは、人気が無いからですかね。
- ベストアンサー
- その他(データベース)
- select されたレコードの操作
以下のようなuser_idとuser_pwのtableがあります。 |id(ai)|user_id|user_pw|flg| |1|AAA|111|0| |2|BBB|222|0| select id from table where user_id = AAA をされると 1 を返し、 update table set flg = 1 where id = 1 かまたは update table set flg = 1 where user_id = AAA を発行したいと思っています。 ただ、sql 発行元から2個のsqlを出せない事情があり、DB側で対応しなければなりません。 トリガはselectでは使えませんよね? 最悪、query_logを監視しながらselectが来たら自分でupdateを発行するスクリプト しかないのかと考えています。 アドバイスお願いします。
- 締切済み
- MySQL
- SQL文で作ったデータを使ったUPDATE
環境はMySQL5.6です。 下記のテーブルccがあります。 【cc】 shisan user 500 tanaka 1000 mikami 400 tanaka 1300 mikami SELECT Total, user FROM (SELECT SUM( cc.shisan ) AS Total, user FROM cc GROUP BY user) AS t1 とすることによりSQL上にt1テーブルを作ることが出来ます。 【t1】 Total user 900 tanaka 2300 mikami 次に、このt1テーブルのTotalの数値を下記のmoney_tableにあるcash欄に挿入(UPDATE)したいと考えています。 【money_table】 cash user 0 tanaka 0 mikami そこで下記のSQL文を作ったのですがエラーになります。 UPDATE money_table,cc SET money_table.cash=t1.Total FROM (SELECT Total, user FROM (SELECT SUM( cc.shisan ) AS Total, user FROM cc GROUP BY user) AS t1) WHERE money_table.user=t1.user どこがいけないのかご指導いただけませんでしょうか? よろしくお願いいたします。
- ベストアンサー
- MySQL
- 単純なクエリーなのにSELECTしてもEmpty
| Field | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+---------+----------------+ | page_id | int(10) | NO | PRI | NULL | auto_increment | | site | varchar(255) | YES | MUL | NULL | | ... ... ... このようなテーブルがあり、以下の様なSELECT文を発行してもEmptyとなってしまいます。 > SELECT `page_id` FROM `table` WHERE `site` = 'hoge'; 自分なりに色々と調べてみたところ、 > UPDATE `table` SET `site` = 'fuga' WHERE `page_id` = 1; > SELECT `page_id` FROM `table` WHERE `site` = 'fuga'; とするとちゃんと1件返ってきます。 ですが、また > UPDATE `table` SET `site` = 'hoge' WHERE `page_id` = 1; > SELECT `page_id` FROM `table` WHERE `site` = 'hoge'; とするとEmptyとなってしまいます。 どうやら、INSERTしたレコードをWHERE `site` = 'hoge'するとEmptyとなるような気がします。 何度も試したので、単純に`site` = 'hoge'の文字列自体が間違っている、などのことは無いはずです。 以下の点も合わせて、どのような原因が考えられるでしょうか。 ・レコードのINSERTは、クローラーによって行われていています。 ・他のフィールドは通常通りSELECTすることができます。 ・ストレージエンジンはmroongaです。 どなたか解決策がわかる方いらっしゃいましたら、ご回答頂ければ幸いです。 宜しくお願い致します。
- ベストアンサー
- MySQL
- SELECT FOR UPDATE で該当レコードがなかった場合
SELECT FOR UPDATE ですが、該当レコードのみ ロックすると思うんですが、 該当レコードがない場合は、 ロックできないんでしょうか? たとえば、(COLUMN_BBB が PK として) SELECT * FROM TABLE_AAA WHERE TABLE_AAA.COLUMN_BBB = 'BBB' FOR UPDATE で、そもそも SELECT * FROM TABLE_AAA WHERE TABLE_AAA.COLUMN_BBB = 'BBB' となるレコードがない場合でも、 他トランザクションによる 該当レコードの INSERT を排他防御できるのか無理なのか、 教えていただけたらありがたいです。 すみません、時間的余裕があまりないので、 (すぐに回答ほしいです)でアップします。
- 締切済み
- Oracle
- 複雑な条件下におけるupdate文について
sqlserver(2008R2)についてクエリ文が上手く書けません。 お手数をおかけいたしますが、お分かりになる方はご教授いただければと 思います。 まず、元となるテーブルおよび作成したい完成系は添付ファイルをご確認下さい。 personal_id、personal_name、personal_address、personal_tel、personal_date列を 持つテーブル(personal_table)から 「select * into #table01 personal_table」に よって一時テーブル#table01を作成し、personal_name・address・telがnullの場合に、 personal_dateが直前時におけるnull以外の値をセットしたいと思っています。 (ただし、セットするのはpersonal_id毎で、最もpersonal_dateが若い者には 必ずpersonal_name・address・telが入っているものとします)。 なお、以下は私が作成したクエリになります。 項目1つずつっと思い、 とりあえずpersonal_nameをpersona_idおよびpersonal_dateを用いて updateしようと思ったのですが、personal_nameがすべてnullになってしまいました。 --------------------------- select * into #table01 from personal_table update #table01 set personal_name = (select personal_name from #table01 A where #table01.personal_id = A.personal_id AND #table01.personal_date = (select MAX(A.personal_date) from #table01 A where #table01.personal_date > A.personal_date AND #table01.personal_id = A.personal_id)) SELECT * from #table01 --------------------------- 完成系を作成するにあたってどのようなクエリを書けばよろしいのか、 ご教授いただければと思います。
- ベストアンサー
- SQL Server