2016-10-21 12 views
0

2つのテーブルT1とT2を持つAccess 2010データベースがあります。 更新クエリを書き、T1の値がT2の値で更新されるようにします。 T2はT1にはない追加のフィールドを持っています。これらのフィールドは、更新のために無視する必要があります。これらのフィールドを除いて、T1とT2は同じフィールドとフィールド名を共有します。ms-accessテーブルの値を別のテーブルの値で更新する

フィールドの数が非常に多い(少なくとも50)ので、私は単純なドラッグ&ドロップクエリの構成を探していた。デザインビューで、T1のプライマリキーをT2のプライマリキーにドラッグして、両方のテーブルを接続しました。次に、テーブルビューの下のデータグリッドにT1のすべてのフィールドを追加しました。

これで、追加されたフィールドの下の各フィールド([T2]。[fieldname])を選択して入力する必要があります。私が達成しようとしているのは、それらの情報が自動的に入力されるということです。アクセスがそのような不可欠な機能を欠いており、誰かが正しい方向で私を指摘したり、なぜこれが私のテーブルを更新するための適切な方法ではないのかについてのいくつかの洞察を与えることに感謝します。

答えて

2

更新クエリでINNER JOINを考えてみましょう:あなたは簡単にデザインビューで行われていないが分かったとして

UPDATE Table1 t1 
INNER JOIN Table2 t2 ON t1.ID = t2.ID 
SET 
    t1.Col1 = t2.Col1, 
    t1.Col2 = t2.Col2, 
    t1.Col3 = t2.Col3, 
    ... 

しかし、50のフィールドのSETラインを書くことは少し面倒です。したがって、テーブル定義のフィールドを反復処理、クエリ定義を使用してVBAでプログラム的にクエリを作成することを検討:

Public Sub CreateUpdateQuery() 
    Dim tbl As DAO.TableDef 
    Dim qdf As DAO.querydef 
    Dim fld As DAO.Field 
    Dim strSQL As String 

    strSQL = "UPDATE Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID SET " 

    For Each tbl In CurrentDb.TableDefs 
     If tbl.Name = "Table1" Then 
      For Each fld In tbl.Fields 
       If fld.Name <> "ID" Then 
        strSQL = strSQL & " t1.[" & fld.Name & "] = t2.[" & fld.Name & "]," 
       End If 
      Next fld 
     End If 
    Next tbl 

    strSQL = Left(strSQL, Len(strSQL) - 1) & ";"     ' REPLACING LAST COLUMN 

    For Each qdf In CurrentDb.QueryDefs 
     If qdf.Name = "QryName" Then 
      CurrentDb.Execute "DROP TABLE " & qdf.Name   ' DELETES QUERY IF EXISTS 
     End If 
    Next qdf 

    Set qdf = CurrentDb.CreateQueryDef("QryName", strSQL) ' SAVES A STORED QUERY 

    Set tbl = Nothing 
    Set qdf = Nothing 
End Sub 
+0

まだテストしていないと、これを行うには完璧な方法のようです。 2つのテーブルの間にリレーションシップを作成することができるため、Accessがデザイナを使用してこの機能をどのように提供していないのか、私は非常に混乱していました。コードとSQ​​Lクエリをありがとう! – dm1988

1

のようなもの、私はあなたの試みに問題が何であるかわからないんだけど、あなたの目標は、コード化された更新クエリを使用して簡単です:だけあなたがしたいT1からフィールドを含めることで

UPDATE T1 
SET T1.col1 = T2.col1, 
    T1.col2 = T2.col2, 
    T1.col3 = T2.col3, 
    [repeat for each field you're updating] 
WHERE T1.pKey = T2.pKey 

T2の余分なフィールドは重要ではありません。

+0

私はクエリを記述しないような方法を探していた、変更の対象とすることができ、すべての50個のフィールドを含むだと、あまりにも。あなたの努力をまだありがとう! – dm1988

関連する問題