- ベストアンサー
UPDATEでSETする値
いつもお世話になっております。 下記のように2つのテーブルがあるとして、 在庫TBL ----------- 在庫コード 在庫名称 発注明細TBL ----------- 明細コード 在庫コード 在庫名称2 個数 在庫名称2に在庫TBLの在庫名称をUPDATEしたいのです。もちろん在庫TBLの在庫コード=明細TBLの在庫コードです。 UPDATE 発注明細TBL SET 明細.在庫名称2 = 在庫.在庫名称 WHERE 明細.在庫コード = 在庫.在庫コード とやってもエラーになってしまいます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
在庫に無いコードの名称はどうするかがわからないので、あのようなSQL文にしました。 複数のカラムの更新をしたいのであれば、 INNER JOINのイメージであれば、 UPDATE 発注明細TBL SET 発注明細TBL.在庫名称2 = 在庫TBL.在庫名称 ,発注明細TBL.[明細のカラム] = 在庫TBL.[在庫のカラム] ・・・・・・・・・・・・・・・・・・・・ FROM 在庫TBL WHERE 在庫TBL.在庫コード = 発注明細TBL.在庫コード でできます。 LEFT JOINのイメージはサブクエリかな? どうしたいのかを言っていただかないと、どっちにも転向しやすい方法でしか、物を言えませんので、どうしたいかを予め伝えていただけると助かります。
その他の回答 (4)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
失礼しました。。。 カテゴリが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) すいません。。。
補足
SQL ServerのUPDATE文は、 1つのテーブルの項目しか記述できなくて、 複数リンクさせたりしたい場合は、サブクエリを使うのですね?
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
※在庫.コードに存在がある (1)更新後の明細.名称(INNERでの結合) ⇒在庫.名称に更新 (2)更新後の明細.名称(LEFTでの結合) ⇒在庫.名称に更新 ※在庫.コードに存在しない (3)更新後の明細.名称(INNERでの結合) ⇒明細.名称を引き継ぐ (4)更新後の明細.名称(LEFTでの結合) ⇒NULLに更新 ってことです。
補足
ご親切にありがとうございます。 よくわかりました。 INNER JOINで実行したところ、 「AS付近に正しくない構文があります」という エラーになってしまうのですが、なにかわかりますか?
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
追記です。 >INNER JOIN を LEFT JOIN に変更した場合 在庫TBL.在庫コードに存在していない、発注明細TBL.在庫コードを持つレコードの在庫名称2をNullにします。
補足
INNER JOINの場合は在庫TBL,明細TBL両方にあるものだけ更新ということでしょうか? INNER JOINのままだと、在庫TBLに存在しない 発注TBLの在庫コードはどうなりますか?
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
UPDATE 発注明細TBL AS 明細 INNER JOIN 在庫TBL AS 在庫 ON 明細.在庫コード = 在庫.在庫コード SET 明細.在庫名称2 = 在庫.在庫名称
補足
すみません、深い意味はなかったのですが AccessのSQLとTransactSQLのUPDATE文の違いが知りたかっただけです。#4の説明で十分やりたいことは達成できました。