• ベストアンサー

UPDATEでSETする値

いつもお世話になっております。 下記のように2つのテーブルがあるとして、 在庫TBL ----------- 在庫コード 在庫名称 発注明細TBL ----------- 明細コード 在庫コード 在庫名称2 個数 在庫名称2に在庫TBLの在庫名称をUPDATEしたいのです。もちろん在庫TBLの在庫コード=明細TBLの在庫コードです。 UPDATE 発注明細TBL SET 明細.在庫名称2 = 在庫.在庫名称 WHERE 明細.在庫コード = 在庫.在庫コード とやってもエラーになってしまいます。

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

  • ベストアンサー
回答No.5

在庫に無いコードの名称はどうするかがわからないので、あのようなSQL文にしました。 複数のカラムの更新をしたいのであれば、 INNER JOINのイメージであれば、 UPDATE 発注明細TBL SET 発注明細TBL.在庫名称2 = 在庫TBL.在庫名称 ,発注明細TBL.[明細のカラム] = 在庫TBL.[在庫のカラム] ・・・・・・・・・・・・・・・・・・・・ FROM 在庫TBL WHERE 在庫TBL.在庫コード = 発注明細TBL.在庫コード でできます。 LEFT JOINのイメージはサブクエリかな? どうしたいのかを言っていただかないと、どっちにも転向しやすい方法でしか、物を言えませんので、どうしたいかを予め伝えていただけると助かります。

nana_poco
質問者

補足

すみません、深い意味はなかったのですが AccessのSQLとTransactSQLのUPDATE文の違いが知りたかっただけです。#4の説明で十分やりたいことは達成できました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.4

失礼しました。。。 カテゴリがaccessだと思っており、勘違いしました。。。。 SQL-Serverでした。。。。 訂正いたします。。。。。 先ほどで言うとLeft Joinのイメージはこれです。 ------------------------------------------------- UPDATE 発注明細TBL SET 在庫名称2 = ( SELECT 在庫名称 FROM 在庫TBL WHERE 在庫コード = 発注明細TBL.在庫コード ) ------------------------------------------------- INNER Joinのイメージは、先ほどのSQLに↓を追加してください。。。 WHERE EXISTS (SELECT 在庫名称 FROM 在庫TBL WHERE 在庫コード = 発注明細TBL.在庫コード) または WHERE 在庫コード IN (SELECT 在庫コード FROM 在庫TBL) すいません。。。

nana_poco
質問者

補足

SQL ServerのUPDATE文は、 1つのテーブルの項目しか記述できなくて、 複数リンクさせたりしたい場合は、サブクエリを使うのですね?

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

※在庫.コードに存在がある (1)更新後の明細.名称(INNERでの結合) ⇒在庫.名称に更新 (2)更新後の明細.名称(LEFTでの結合) ⇒在庫.名称に更新 ※在庫.コードに存在しない (3)更新後の明細.名称(INNERでの結合) ⇒明細.名称を引き継ぐ (4)更新後の明細.名称(LEFTでの結合) ⇒NULLに更新 ってことです。

nana_poco
質問者

補足

ご親切にありがとうございます。 よくわかりました。 INNER JOINで実行したところ、 「AS付近に正しくない構文があります」という エラーになってしまうのですが、なにかわかりますか?

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

追記です。 >INNER JOIN を LEFT JOIN に変更した場合 在庫TBL.在庫コードに存在していない、発注明細TBL.在庫コードを持つレコードの在庫名称2をNullにします。

nana_poco
質問者

補足

INNER JOINの場合は在庫TBL,明細TBL両方にあるものだけ更新ということでしょうか? INNER JOINのままだと、在庫TBLに存在しない 発注TBLの在庫コードはどうなりますか?

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

UPDATE 発注明細TBL AS 明細 INNER JOIN 在庫TBL AS 在庫 ON 明細.在庫コード = 在庫.在庫コード SET 明細.在庫名称2 = 在庫.在庫名称

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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
  • 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
  • SQLITEで全角テーブルアップデート

    SQLITEで全角テーブルアップデート こんにちは。SQLITEでアップデートをしたいと思っています。問題がテーブル名が全角文字です。 テーブル名: T_在庫 フィールド: 商品コード,在庫 001,3 002,2 003,5 下記のSELECT文は動きます。 SELECT "T_在庫"."商品コード","T_在庫"."在庫" FROM "T_在庫" 次にUPDATEをかけたいと思っています。 UPDATE "T_在庫" SET "T_在庫"."在庫" = 0 [Err] 1 - near ".": syntax error このように表示されます。 試しに、ダブルクォテーションを外しても同じです。 どのようにすればSQLITEでアップデートがかけることができるのでしょうか?文法は間違っていないとは思うのですが・・・

  • 別テーブルの値をsetしてupdateしたい

    テーブルAとテーブルBで、idが一致したデータのみ、 テーブルAのフィールドにテーブルBの値を入れたいです。 tera termを使用して、 UPDATE tableA as a, tableB as b SET a.value = b.value WHERE a.id = b.id 上記のupdate文を流すと一行目の[as a]からsyntaxエラーが出ます。 ERROR 1064: You have an error in your SQL syntax near 'as a, tableB as b SET ~' at line 1 書き方が悪いのでしょうか? どのように記述すればb.valueをa.valueにsetできますか?

    • ベストアンサー
    • MySQL
  • 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;

  • MySQL UPDATE SETが失敗なのに1が返る

    MySQL UPDATE SETが失敗なのに1が返る いつもお世話になります。 MySQL5.0 PHP5 PEAR(DB)にて開発中です。 "UPDATE master SET xxx={$xxx}+1 WHERE id={$id} AND xxx={$xxx}" 上記クエリを実行し、 WHERE以下に該当しないない場合は、該当データー無しとして別の処理を行う予定です。 該当すればそのままUPDATEでいいのですが、 ここで該当無しとなれば、通常UPDATEの場合は返り値として0が戻るはずなのでが、 どうしても1が戻ってしまいます。 その為、if($res==0) として判定できず困っております。 ※もちろん、該当無しのUPDATEの場合は、テーブル内のデーターは変更されていません。 どなたか回答をお寄せ下さい。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • 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 );

  • 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

    タイトルの通り、複数テーブルのUPDATEを行いたいと思っています。 私なりには、以下のようなコードでテーブルを作成しようとしましたが、作成できませんでした。 エラー内容としては、 update table_1, table_2 SET のtable_1, が間違ってます的なエラーでした。 update table_1, table_2 SET table_1.updatetime=getdate(), WHERE table_1.SeqNo = table_2.SeqNo AND table_1.SeqNo = @SeqNo 以上、緊急の内容であったため、十分調べていない点があるかもしれませんが、何卒、ご存知の方ご教授お願い致します。

  • ACCESS VBAのDSUMを使ってUPDATE

    よろしくお願いします。 通貨型のACCESSデータベースのレコードにDSUMを使ったUPDATE文で更新をしたいのですが、 うまくいきません。 イミディエイトウィンドウで出力したSQLをACCESSのクエリーで実行したところ、 "1個のフィールドで型変換エラー"となります。 実行したSQLは下記のようなものです。 UPDATE テーブル名 SET フィールド名 = DSUM(フィールド名,"テーブル名",コードI = '0000' AND コードII BETWEEN '5110' AND '5410') WHERE コードI = '0000' AND コードII = '5980'; 因みに、更新元テーブルと更新先テーブルは同じテーブルです。 行いたいのは、コードII列の「5110」~「5410」の合計値を、「5980」の場所にUPDATEを させようとしてます。 よろしくお願いします。