• 締切済み

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` = '支払済') だと動作するのですが無駄な記述が多いような。 簡潔に出来る方法はありますか? ご存知の方教えてください。

  • MySQL
  • 回答数2
  • ありがとう数0

みんなの回答

  • castoff
  • ベストアンサー率15% (7/46)
回答No.2

そもそもDBはなんですか? Oracle SQLServer MySQL 等など DBによってSQL文は違ってきますよ。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

バージョンはいくつでしょうか? サブクエリを使っているので大丈夫だとは思いますが 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.色) どのような記述をすれば良いのでしょうか?

  • 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) 変な質問ですいませんが、何か方法があるのでしょうか。 よろしくお願いします。

  • 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でもエラーが発生しているのかもしれませんが、現状調査不可能為不明です。 いろいろデッドロック、ロックヒントなどいろいろ調べてみた結果、なんとなく発生するかも?とは思われますが、このような場合、本当にデッドロックが発生するのでしょうか? また、発生する場合には、何と何がデッドロックになっているのでしょうか? (発生するはずがないとなると調査する視点を変えてみます。) よろしくお願いします。

  • 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を発行するスクリプト しかないのかと考えています。 アドバイスお願いします。

  • 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 を排他防御できるのか無理なのか、 教えていただけたらありがたいです。 すみません、時間的余裕があまりないので、 (すぐに回答ほしいです)でアップします。

  • 複雑な条件下における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 --------------------------- 完成系を作成するにあたってどのようなクエリを書けばよろしいのか、 ご教授いただければと思います。