update文の一括発行

このQ&Aのポイント
  • parent_idという親テーブルのIDを格納するフィールドとidという自分のIDを格納するフィールドとデータを格納するdataというフィールドがあるtbl01というテーブルがあります。
  • parent_id = 1が格納されているレコードにデータを次々と更新していきたい場合、1回のupdate文でまとめて発行する方法はありますか。
  • 1回1回発行するのは時間がかかるため、できれば1回でまとめて発行したいです。
回答を見る
  • ベストアンサー

update文の一括発行

お世話になります。 parent_idという親テーブルのIDを格納するフィールドと idという自分のIDを格納するフィールドと データを格納するdataというフィールドがあるtbl01というテーブルがある場合に update tbl01 set data = 'xxx' where parent_id = 1 and id = 1 update tbl01 set data = 'yyy' where parent_id = 1 and id = 2 update tbl01 set data = 'xyz' where parent_id = 1 and id = 3 ※dataに格納するデータは親テーブルとは関係ない独立したデータです。 という感じにparent_id = 1が格納されているレコードにデータを次々と更新していきたいのですが 1回のupdate文でまとめて発行するやり方はあるのでしょうか。 1回1回発行するのは時間がかかるためできれば1回でまとめて発行したいのです。 update tbl01 set data in ('xxx', 'yyy', 'xyz') where parent_id = 1 and id in(1, 2, 3) イメージとしてはこんな感じです。 よろしくお願いいたします。

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

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

> update tbl01 > set data in ('xxx', 'yyy', 'xyz') > where parent_id = 1 > and id in(1, 2, 3) これは無理ですね。そもそもidの(1,2,3)と('xxx', 'yyy', 'xyz')のヒモ付がなされていません。 create temporary table tmp01 ( id int, parent_id int, data varchar(10) ); で一時テーブルを作り、 insert into tmp01 values ( 1,1,'xxx'),(1,2,'yyy'),(1,3,'zzz'); update tbl01 join tmp01 on tbl01.id=tmp01.id and tbl01.parent_id=tmp01.parent_id set tbl01.data=tmp01.data; ではダメですか?

その他の回答 (2)

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.3

CASE 使えば? update tbl01 set data = (case id when 1 then 'xxx'       when 2 then 'yyy'       when 3 then 'zzz' else data end) where id in (1, 2, 3) and parent_id = 1 http://dev.mysql.com/doc/refman/5.1/ja/case-statement.html

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

データが3つくらいじゃ効果は薄いですが、一度テンポラリにデータを 格納してからupdateすればすっきりします create temporary table tmp(id int,data varchar(30)); insert into tmp values(1,'xxx'),(2,'yyy'),(3,'zzz'); update tbl01 inner join tmp using(id) set tbl01.data=tmp.data where parent_id = 1;

関連するQ&A

  • UPDATEを高速化したい

    MySQLバージョン4.1.16を使用しています。 複数の行をそれぞれの決まった値で更新したいのですが、 下のような記述の仕方だと更新する行が増えるにつれ、 それ相応に遅くなってしまいます(かといって他の記述の仕方を知りませんが・・・) なにかもっと高速になるような記述というのはあるのでしょうか? SET AUTOCOMMIT=0; START TRANSACTION; UPDATE tbl SET field = 'a' WHERE id = '1'; UPDATE tbl SET field = 'b' WHERE id = '2'; UPDATE tbl SET field = 'c' WHERE id = '3'; COMMIT; SET AUTOCOMMIT=1;

  • Access Update文の副問い合わせ

    以下のAのSQLをAccessから実行すると「実行時エラー3073 更新可能なクエリであることが必要です。」エラーが表示されます。 一時、待避としてBのような処理をしていますが、かなり処理速度がかかります。 何とかAのような1文で処理できないでしょうか? 'A================================================ Update PV_PRINT pv Set 勉強日 = (SELECT max(日付) as 日 FROM 基本記録テーブル where 項目2 between 3011 and 3014 and pv.USER_NUM = 基本記録テーブル.ID GROUP BY ID); 'B================================================ stSQL = "SELECT max(日付) as 日, ID FROM 基本記録テーブル where 項目2 between 3011 and 3014 GROUP BY ID;" Set TBL1 = CurrentDb.OpenRecordset(stSQL) Do Until TBL1.EOF stSQL = "UPDATE PV_PRINT " stSQL = stSQL & " SET PV_PRINT.勉強会日 = " & Format(TBL1![日], "yyyymmdd") stSQL = stSQL & " WHERE PV_PRINT.USER_NUM = " & TBL1![ID] & ";" CurrentDb.Execute stSQL TBL1.MoveNext Loop Set TBL1 = Nothing

  • updateのパラメータを即値でなくDBからセットしたい

    update TBL set NAMAE='AAA', TOSHI=●● WHERE ID=1 ●●の部分をリテラルでなく、例えばID=2のTOSHIのデータをセットしたいのですが、そのような事は、update1文でできるのでしょうか? TBLテーブル ID NAMAE TOSHI 1 2 BBB 50 3 CCC 40

    • ベストアンサー
    • MySQL
  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75

  • UPDATE文の書き方を教えて下さい。

    いつもお世話になっています。 UPDATEの書き方について教えて下さい。 以下のようなUPDATE文を作成しました。 処理的には必要な結果を返してくれていますが、もう少しシンプルには ならないでしょうか? UPDATE文がまだ理解出来ていないのですが、”WHERE EXISTS(”以降に 書いているSELECT文は、SET文の値算出時にも同じSELECT文を書いて いるのですが、それを代用することは出来ないのでしょうか? (SELECTの結果をWHERE文の中で簡単に呼び出して使えないのでしょうか?) ※うまく内容が伝わってないかもしれませんが、どうぞよろしくお願いします。 <<<更新処理>>> UPDATE TBL01 SET( TBL01_MARNO, TBL01_UPDYMD )=( SELECT TBL02_MARNO, TO_NUMBER(TO_CHAR(SYSDATE,'YYYYMMDD')) FROM (SELECT TBL02_TENCD, TBL02_REN, TBL02_MARNO, TBL02_UPDKBN, RANK () OVER (PARTITION BY TBL02_TENCD, TBL02_REN ORDER BY TBL02_YMD DESC, TBL02_DAT DESC ) WRK_RANK FROM TBL02 WHERE TBL02_OKFLG = 1 ) WHERE TBL02_TENCD = TBL01_TENCD AND TBL02_REN = TBL01_REN AND WRK_RANK = 1 AND TBL02_UPDKBN = 2 ) WHERE EXISTS( SELECT 'TRUE' FROM (SELECT TBL02_TENCD, TBL02_REN, TBL02_MARNO, TBL02_UPDKBN, RANK () OVER (PARTITION BY TBL02_TENCD, TBL02_REN ORDER BY TBL02_YMD DESC, TBL02_DAT DESC ) WRK_RANK FROM TBL02 WHERE TBL02_OKFLG = 1 ) WHERE TBL02_TENCD = TBL01_TENCD AND TBL02_REN = TBL01_REN AND TBL02_UPDKBN = 2 AND WRK_RANK = 1 );

  • update文に条件をつける場合

    update文に条件をつける場合 初心者です。よろしくお願いします。 update TABLE set HOGE = replace(HOGE,'文章','ブンショウ') こちらのupdate文にもう一つ条件をつけたいのですが、WHERE句をいれるとエラーがでてしまいます。 update TABLE set HOGE WHERE XXX = "YYY" = replace(HOGE,'文章','ブンショウ') update TABLE set HOGE WHERE XXX = "YYY" AND replace(HOGE,'文章','ブンショウ') エラーがでてしまいます、、、、WHERE XXX = "YYY"のような条件をだしたい場合はどのようにしたら良いでしょうか。 よろしくお願いします。m(_ _)m

    • ベストアンサー
    • MySQL
  • SQLで複数のテーブルと結合したUPDATE文

    普通のUPDATE文はUPDATEするテーブル名を一つ記入して UPDATE テーブルA SET フィールドA = 値A WHERE テーブルA.フィールドB = 値B みたいな感じですが、私のしたい事はと言うと UPDATE テーブルA,テーブルB,テーブルC SET A.フィールドA = 値A WHERE テーブルA.フィールドA = テーブルB.フィールドB AND テーブルB.フィールドB = テーブルC.フィールドC AND テーブルB.フィールドD = 値D AND テーブルC.フィールドE = 値E という具合に複数のテーブルがUPDATEするテーブルA以外のところで、互いに条件で結ばれており、FROM句でUPDATEしないテーブル名まで宣言しないといけなくなっています。そもそもこういうFROM句を使うUPDATE文は実行可能かも不明です。どなたか解決策お願いいたします。ちなみに開発ソフトはVBAを使っています。

  • updateの一括実行

    SQLに関しまして質問させて頂きます。 更新元テーブルA、マスタテーブルB、更新先テーブルCがあり、 以下のような条件を一つのSQL文で実現したいと思っています。 【条件】 (1)Aのe列が1のものを対象に更新をかける (2)条件(1)を満たすレコードの各所属&氏名をマスタBのIDに置き換え、テーブルCに更新 【テーブルA(更新元)】 ----------------------------------------------- No 所属1 氏名1 所属2 氏名2 所属3 氏名3 e 01 A01  ああ  A01  いい  C01  おお 1 02 A01  いい  A01  うう  C01  おお 0 03 B01  ああ  B01  ええ  C01  おお 1 ----------------------------------------------- 【テーブルB(マスタ)】 ----------------- ID  所属 氏名 001  A01  ああ 002  A01  いい 003  B01  ああ : ----------------- 【テーブルC(更新先)】 ------------------ No ID1 ID2 ID3 01 001 002 025 02 002 003 025 03 011 014 025 ------------------ テーブルAが1レコードであれば update C set ID1=(select ID from A, B where A.所属1=B.所属 AND A.氏名1=B.氏名) ID2=(select ID from A, B where A.所属2=B.所属 AND A.氏名2=B.氏名) ID3=(select ID from A, B where A.所属3=B.所属 AND A.氏名3=B.氏名) where No='01' で行くのですが、10000行の更新で10000回update文を発行すると処理に時間がかかります。 そこで、updateの一括実行を行いたいと考えています。 ご存知の方がいらしましたら、 ご教授よろしくお願い致しますm(_ _)m 【環境】 oracle 9i

  • UPDATE文について

    昨日こちらで自分の間違ったSQL文をご指摘頂き 時間計算の処理は実装する事が出来たのですが その後の計算処理が終わった後、計算結果をDBに格納する処理で 再度躓いてしまったので、再度のご教授お願いします。 $sql = "SELECT SUM(ROUND(労働時間/100, 0)) + ROUND(SUM(MOD(労働時間,100)) / 60, 2) AS total     FROM 労働時間テーブル WHERE id = 'ログインしている人のID';"; $total_Time = pg_query($con, $sql); $total_Time = pg_fetch_result($total_Time, 0, 'total'); // 確認のため、表示 echo $total_Time; で値はきちんと表示されおります。 しかし、この後UPDATE文で $sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';"; pg_query($con, $sql); と打ち試しましたが、echoの時に表示された値がDBに格納されません。(>_<) 試しに $sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';"; の'$total_Time'をSELECT文に変更したりもしましたが、echoの時に 表示されていた値とは違う値がDBに格納されるようになってしまいました。 どのように解決したらよいか、悩んでおります。 そもそもの考え方から間違っているのでしょうか? ご教授の程、よろしくお願い致します。

  • UPDATE文のWHERE句にファンクション使いたい

    [OSのVER]:WindowsXP [OracleのVER]:9i UPDATE時にWHERE句に自作のユーザ関数を使いたいと思っていますが、 更新されずに困っています。 (エラーも出ません) 例) update TG_TBL set S_YMD = '20060601', LAST_UPDATE = SYSDATE , where ID_NO = '1401001' and CHK_SIK(ID_NO) in (1,2) ←使用したいチェック関数 ちなみに、以下のように同じ関数を使用すると1件のレコードが検索されます。 select * from TG_TBL where KANRI_NO = '1401001' and CHK_SIK(ID_NO) in (1,2) 関数部分をコメントアウトして、実行すると1件更新されます。 UPDATE文にユーザ関数を使用することはできないのでしょうか? 皆様のお知恵をお貸しください。 よろしく、お願いいたします。