accessでの表の更新(UPDATE文)

このQ&Aのポイント
  • accessでの表の更新に関して教えてください。
  • access2010を使用し、結合したテーブルの更新方法を知りたいです。
  • TBL1とTBL2をKeyで結合し、TBL1のNullのM1にTBL2のNumberをセットしたいです。
回答を見る
  • ベストアンサー

【access】表の更新(UPDATE文)

accessでの表の更新に関しご教示ください。 access2010を使用しTBLを結合後、更新を行いたいです。 具体的には以下の通り。 ■仕様 TBL1(ローカルテーブ)とTBL2(リンクテーブル)をKeyで結合。 TBL1.M1がNullの項目に対し、TBL2.Numberをセットしたい。 TBL1(全てテキスト型) ―――――― Key |M1 ―――――― 1  |A123 ―――――― 2  | ―――――― 3  |C123 TBL2(全てテキスト型) ―――――― Key |Number ―――――― 1  |A123 ―――――― 2  |B123 ―――――― 3  |C123 ■実行結果が上手くいかなかったSQL UPDATE TBL1 as T1 INNER JOIN TBL2 as T2 ON T1.Key = T2.Key SET T1.M1 = T2.Number WHERE T1.M1 Is Null OR T1.M1 LIKE "*";

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

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

【訂正】No.2さんの回答を見て・・・ あちゃー! UPDATE TBL2 INNER JOIN TBL1 ON TBL2.Key=TBL1.Key SET TBL2.M1 = TBL1.M1 WHERE LEN(TBl2.M1 & "")=0; INNER JOIN しているので WHERE節は《ヌルならば》で事足りることを失念し無駄な条件を書いていることに気が付きました。当然に「あっ、そうなんだ!」とは悟られたでしょうが・・・。ここに、明示的に訂正しておきます。なお、IsNUll()ではなくてLEN()を用いる場合は LEN(TBl2.M1=0; は、エラーになります。 LEN(TBl2.M1 & "")=0; とヌル値対策が必要です。

sunflower153
質問者

お礼

ご丁寧にありがとうございました。 ご教示頂いた内容で上手くいきました。

その他の回答 (3)

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.4

それぞれのテーブルのkeyが主キーまたは重複なしになっていることが前提です。 処理を間違えると逆方向にコピーされます、テーブルのバックアップしてください 添付のように更新クエリを使います。 1.クエリデザインからTBL1、TBL2の表示 2.TBL1.keyからTBL2.Keyへドラッグして関連付けします 3.空白部分右クリックからクエリの種類、更新と進んで更新行を表示させます。 あとは添付図を参考にして下さい テーブル表示域の枠内の右クリックからSQIレビューで次のSQL文が表示されます UPDATE TBL1 LEFT JOIN TBL2 ON TBL1.key = TBL2.key SET TBL1.M1 = [Number] WHERE (((TBL1.M1) Is Null));

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

Where句のところが少し残念ですが、他のところも いろいろありますが、一応以下で動くと思います。 update TBL1 inner join TBL2 on TBL1.Key = TBL2.Key set TBL1.M1 = TBL2.Number where IsNull(TBL1.M1) のように、 where IsNull(TBL1.M1) で十分のはずですが。 IsNullは関数のIsNullを使いますので、Is とNull を離して表記はしません。

回答No.1

Q、TBL2にTBL1をコピーするには? A、SQL文が苦手であれば・・・ 次のような手もあります。が、これが、仮に学校の宿題であれば、以下の手法はアウトです。 UPDATE TBL2 SET M1 = DBLookup("SELECT M1 FROM TBL1 WHERE Key=" & [Key]) AND LEN(TBL2.M1 & "")=0; *列名は、もちろんM1=>Numberに変更する必要があります。 *回答では、TBL2を更新しています。TBL1でも同じこと。 要は、SQL文の実行結果を戻す関数を用意すれば、結合とか複文とかを考えなくても同じ結果を得ることができるということです。もちろん、邪道と言えば邪道。でも、結果オーライで良ければこれもありですね。 Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function ※※※※※※※※※※※※※※※  PS、本来のやり方 ※※※※※※※※※※※※※※※ UPDATE TBL2 INNER JOIN TBL1 ON TBL2.Key=TBL1.Key SET TBL2.M1 = TBL1.M1 WHERE TBL2.Key=TBL1.Key AND LEN(TBL2.M1 & "")=0;

sunflower153
質問者

お礼

ご丁寧にありがとうございました。 こちらも試してみて上手くいきました。

関連するQ&A

  • 【access】表の値を別項目にセットする方法

    accessでの表の更新に関しご教示ください。 access2010を使用しTBLの編集を行いたいです。 具体的には以下の通り。 ■仕様 TBL1.M1の項目にカンマ区切りの文字列がある。 上記項目の値をカンマで区切り、TBL1.M2~TBL1,M4にセットしたい。 TBL1(全てテキスト型):編集前 ―――――――――――――――――――― Key |M1   |M2  |M3  |M4    ―――――――――――――――――――― 1  |1,2,3 |   |   | ―――――――――――――――――――― 2  |a,b,c |   |   | ―――――――――――――――――――― TBL1(全てテキスト型):編集後 ―――――――――――――――――――― Key |M1   |M2  |M3  |M4    ―――――――――――――――――――― 1  |1,2,3 |1   |2   |3 ―――――――――――――――――――― 2  |a,b,c |a   |b   |c ―――――――――――――――――――― VBAでプログラムを組んでもなかなか上手くいきません。 良い方法は無いでしょうか。

  • access 更新?追加? クエリ

    ACCESSについて質問です。よろしくお願いします。 「TBL情報管理」 に 電話番号・会員番号・会員名・住所 などのデーターが、 「TBL受注内容」 に 電話番号・会員NO・会員氏名 などのデーターがあります。 「TBL受注内容」の会員NOと会員氏名に「TBL情報管理」の会員番号と 会員名を電話番号をキーにして取り込みたいと思います。 選択クエリなら SELECT TBL受注内容.電話番号, TBL情報管理.会員番号 AS 会員NO, TBL情報管理.会員名 AS 会員氏名 FROM TBL受注内容 INNER JOIN TBL情報管理 ON TBL受注内容.電話番号 = TBL情報管理.電話番号; これでいいのかと思いますが、実際にTBL受注内容にデーターをセット する方法がわかりません。 つたない説明で申し訳ありませんが、よろしくお願いいたします。 WIN XP ACCESS 2003 SP2

  • 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

  • DTS クエリーデザイナ で更新クエリー

    今回、訳あってSQL2000Severを導入する事になり勉強中です。 今までAccessでDB更新/追加/削除は経験あり、HPを見ても移行は簡単なイメージがありましたが、更新クエリーだけイメージがあいません。 TBL A /TBL B の2つのTBLがあり、TBL Aの項目をTBL Bで更新しようとする場合,Accessならクエリーで2つのTBLを追加してTBL AをTBL Bの項目で更新できたのですが、DTSデザイナで更新を選択するとTBL Aしか追加できません。 又、クエリアナライザを使ってもJOINの後の構文エラーから先に進めない状態です。 初歩的質問で申訳ありませんが、助言できる方がいらっしゃいましたら助けて下さい。 サンプルSQL UPDATE [TBL A] AS A INNER JOIN [TBL B] AS B ON A.KOUMOKU = B.KOUMOKU SET [A].[TANKA] = [B].[TANKA]; キーワード 'AS' 付近に正しくない構文があります。

  • Accessで差分取得する方法は? LEFT JOIN エラー

    Accessで差分抽出するSQLを教えてください。 【旧テーブル】t1 id, class, number, value 1, "a", 1, "aka" 2, "a", 2, "aki" 3, "a", 3, "aku" 【新テーブル】t2 id, class, number, value 1, "a", 1, "aka" 2, "a", 2, "更新" 3, "a", 3, "aku" 4, "a", 4, "新規" 5, "b", 1, "新規" 【ダメだったクエリ】 SELECT t2.* FROM t2 INNER JOIN t1 WHERE t1.class IS NULL OR t1.number IS NULL 【望む結果】 4, "a", 4, "新規" 5, "b", 1, "新規" *列 id は各テーブルの主キーですが、新旧テーブル間の関連はありません(リレーションではありません)。

  • VBでSQL文のUPDATE文を使った時のエラー

    access VBA初心者ですが回答、ご指摘のほうよろしければお願いします。 フォームにて更新ボタン押下時、テーブルの更新日付を現在の日付で更新したいと考えております。 下記のようにVBを組み込んだのですが、実行すると「UPDATE ステートメントの構文エラーです」というエラーがでてしまいます。 構文のどこが悪いか御指南いただけないでしょうか。 test_TBLの更新日付のフィールドを現在日付で更新 Dim sql As String Dim newdate As Date newdate = Now() sql = "UPDATE test_TBL SET 更新日付 =#" & newdate & "#" DoCmd.RunSQL sql

  • インラインビューの更新権限について

    UPDATE句をインラインビューを使って実施しようと思い UPDATE ( SELECT A.FLD1,B.FLD2 FROM TBL1 A,TBL2 B WHERE A.KEY1=B.KEY1 AND CONCAT(A.KEY2,A.KEY3)=B.KEY2 AND B.KEY2='12345') C SET C.FLD1=C.FLD2 のようにSQLを書きました。 ORA-01779: キー保存されていない表にマップする列は変更できません のメッセージが出力されました。 CREATE VIEW TEST AS SELECT A.FLD1,B.FLD2 FROM TBL1 A,TBL2 B WHERE A.KEY1=B.KEY1 AND CONCAT(A.KEY2,A.KEY3)=B.KEY2 AND B.KEY2='12345' でビューを作って確認したら select * from user_updatable_columns where table_name='TEST'; OWNER TABLE_NAME COLUMN_NAME UPDATA INSERT DELETA ---------- ----------- --------------- ------ ------ ------ TEST TEST FLD1 NO NO NO TEST TEST FLD2 NO NO NO 確かにUPDATEできないようです。 テーブルはこんな感じです。 TBL1 ------------------------------------------- KEY1 NUMBER 4 PK KEY2 NUMBER 5 PK KEY3 NUMBER 1 PK FLD1 CHAR 6 TBL2 ------------------------------------------- KEY1 NUMBER 4 PK KEY2 NUMBER 6 PK FLD2 CHAR 6 同じように TBL3 ------------------------------------------- KEY1 NUMBER 2 PK KEY2 NUMBER 4 PK KEY3 CHAR 6 PK KEY4 NUMBER 4 PK FLD3 CHAR 6 TBL4 ------------------------------------------- KEY1 NUMBER 4 PK KEY2 CHAR 6 PK FLD4 CHAR 6 でビューを作ったら CREATE VIEW TEST2 AS SELECT A.FLD3,B.FLD4 FROM TBL3 A,TBL4 B WHERE A.KEY2=B.KEY2 AND A.KEY3=B.KEY3 AND A.KEY1='12' AND A.KEY4='1234' OWNER TABLE_NAME COLUMN_NAME UPDATA INSERT DELETA ---------- ----------- --------------- ------ ------ ------ TEST TEST2 FLD3 YES YES YES TEST TEST2 FLD4 NO NO NO 更新可能なようです。 ビューを作ったとき、UPDATEやINSERT文が有効・無効になる違いは何でしょうか? 毎回一旦ビューを作って select * from user_updatable_columns where table_name='TEST'; のような確認しかできないのでしょうか? よろしくお願いいたします。

  • ACCESS 結合ができません。

    祖母が句会に入っていて、私はACCESSを触っているだけなのですが、祖母の周囲にパソコンを使える人が居ないため、頼まれました。 プログラムの変更なのですが、ACCESSを作った人は退会されているので、困り果てております。 ・現在の時間帯が、第2希望まで選べているが、それが第5希望まで選べるようになった。 ・テーブル「T時間M」から「T時間M-4」まであり、-2からは、第2希望から参照している。 クエリの構造については、画像で添付しましたが、仮名に変更してあります。 コードについては、SQLで組まれており、LEFT JOINとなっていますが、3つ以上の結合を行うと、フォームでは「Name?」となってしまいます。 コードの記述についてですが、SQLの構文部分を書き出します。 SQL = "SELECT T会員M.名前," _ & "T男女M.男女, T会員M.年齢, [T時間M.項目C] &" _ & " T時間M.回数 AS 第1, T会員M.当落1," _ & " [T時間M_1.項目C] & T時間M_1.回数 AS 第2, T会員M.当落2" _ & " FROM T時間M INNER JOIN (T男女M INNER JOIN (T会員M LEFT JOIN T時間M AS T時間M_1 ON" _ & " T会員M.第二希望時間CD = T時間M_1.時間id) ON T男女M.男女C = T会員M.男女C) ON" _ & " T時間M.時間id = T会員M.第一希望時間CD " _ この後の記述は & "WHERE ~省略 & " ORDER BY  ~省略 Me.RecordSource = SQL となっています。

  • ACCESSクエリで複数テーブルの値の結合について

    現在、ACCESS2000で2つのテーブルの値を表示するクエリを作成中です。 テーブルは外部データよりインポートしています。 Aテーブル KEY1 | KEY2 | 値1 -------------------------- 00000001 | AAAAAAAA | 100 00000001 | BBBBBBBB | 200 00000002 | AAAAAAAA | 1000 Bテーブル KEY1 | KEY2 | 値1 -------------------------- 00000001 | AAAAAAAA | 500 00000002 | BBBBBBBB | 300 これを、 KEY1 | KEY2 | 値1 ------------------------------------------------ 00000001:00000001 | AAAAAAAA:AAAAAAAA | 100:500 ←(1) 00000001:NULL | BBBBBBBB:NULL | 200:NULL ←(2) 00000002:NULL | AAAAAAAA:NULL | 1000:NULL ←(3) NULL:00000002 | NULL:BBBBBBBB | NULL:300 ←(4) と表示したいのです。 INNER JOIN では、上記(1)しか表示されません。 また、LEFT JOIN では、(1)(2)(3)は表示されますが、(4)が表示されません。 SQLは下記です(INNER JOINを使用した場合) SELECT [Aテーブル.KEY1] & ":" & [Bテーブル.KEY1] AS KEY1, [Aテーブル.KEY2] & ":" & [Bテーブル.KEY2] AS KEY2, [Aテーブル.値1] & ":" & [Bテーブル.値1] AS 値1 FROM Aテーブル INNER JOIN Bテーブル ON ([Aテーブル].[KEY1]=[Bテーブル].[KEY1]) AND ([Aテーブル].[KEY2]=[Bテーブル].[KEY2]); どなかた教えてください。お願いします。

  • Accessでの連鎖更新について

    いつもお世話になっております。 表題の件、アクセスでの連鎖更新についての質問です。 以下のようなテーブルを持っているとしまして T商品マスタ ID:オートナンバー(主キー) 管理番号:INT 商品名:String T部品 管理番号:INT 部品名:String 備考:String T商品マスタとT部品は、管理番号をキーにして1対多になるのですが クエリで T商品マスタ.管理番号 T商品マスタ.商品 T部品.備考 表示自体は、T商品マスタのレコード分のみ表示させて、備考を入力した場合、T部品の管理番号が同じレコードすべてに同じ備考を登録したいのですが、エンティティやクエリの作りについて、どうすればよいか見当がつきません。 T商品マスタの管理番号は、主キーになっておらずNullも許可し重複もあります。 T部品は、主キーがなく同一の管理番号で部品が多数あります。 ネットで調べ、連鎖更新をしようと思ったのですが、エンティティの作成画面でエラーが発生してしまいました。 初心者で、知識がなく説明がうまくできませんが、どうぞよろしくお願い致します。

専門家に質問してみよう