我有一个访问数据库,并且我在数据库的各个方面使用“ DoCmd.RunSQL”来更新/插入和从表中删除。
我有两个表'Table_1',它们刚刚超过8000行。我需要使用具有大约5000行的'Table_2'中的新余额来更新此表中的特定行。
两个表中的公共字段是AccountID和SUBID。
如果Table_2中的AccountID为null,那么我想使用SUBID作为联接。
我尝试了以下代码:
Call RunSQL("INSERT INTO temp_Table " & _
"SELECT TABLE_1.* " & _
",TABLE_2.[Balance], TABLE_2.[T2_AccountID )], TABLE_2.[T2_SUBID )] " & _
"FROM (SELECT * FROM TABLE_1 WHERE TABLE_1.Business = 'Criteria1' AND TABLE_1.Type IN ('Criteria2','Criteria3') ) TABLE_1 " & _
"LEFT JOIN TABLE_2 on " & _
"( IIf(TABLE_2.[T2_AccountID )] IS NOT NULL, TABLE_2.[T2_AccountID )] = TABLE_1.[AccountID ] AND TABLE_2.[T2_SUBID )] = TABLE_1.[SUBID], TABLE_2.[T2_SUBID )] = TABLE_1.[SUBID]) ) ")
上述代码的问题是,它会导致重复,因此将我的记录集增加到原始8k的两倍以上。
这样做的原因是两个表中都有重复的“ SUBID”值,但是并非所有这些SUBID都有对应的“ AccountID”。因此,对于AccountID为null的项目,我想使用SUBID作为联接条件,但是对于那些没有null AccountID的项目,我指定的联接似乎不起作用,并且导致重复。
例如,表1中的SUBID:6583,有两条记录,一条记录在AccountID字段中有一个值,而另一条为null。
在表2中,对于6583的相同SUBID,还有2条记录,类似于TABLE1,其中一条在AccountID字段中具有一个值,而另一条为null。
因此,我在上面的代码中使用的联接导致添加一条记录,这意味着现在存在3条记录,而不是2条记录。其中两条记录中的TABLE2中有一个AccountID字段为空,而其中的AccountID中有2条已填充来自TABLE1,因此似乎在复制TABLE1记录
我尝试通过使用以下加入条件来解决此问题:
LEFT JOIN TABLE_2 on TABLE_2.[T2_AccountID )] = TABLE_1.[AccountID ] AND TABLE_2.[T2_SUBID )] = TABLE_1.[SUBID]
但是,当我使用以上代码时,AccountID为空的记录不会加入。
我尝试了几种不同的方法,但并没有按照需要将两个表连接起来。任何帮助将不胜感激。
预先感谢
答案 0 :(得分:1)
考虑:
UPDATE Table1 INNER JOIN Table2
ON Nz(Table1.AccountID,Table1.SubID)=Nz(Table2.AccountID,Table2.SubID)
SET Table1.Balance = Table2.Balance
WHERE ...;
如果您不想使用VBA Nz()函数:
ON IIf(Table1.AccountID IS NULL, Table1.SubID, Table1.AccountID)=IIf(Table2.AccountID IS NULL, Table2.SubID, Table2.AccountID)