如何合并具有不同列号的两个表,同时删除具有大量列的表的重复项

时间:2013-10-04 15:12:11

标签: sql vba ms-access union

我的Access数据库中有两个表Table1和Table2。 Table1有50列,Table2有30列。我想将Table2与Table1合并,而不复制Table2中任何与表1中的条目的column1到column30中的值具有相同值的条目。

请注意,表1和表2中的列顺序和名称与第30列相同。

我和这个问题How do I merge two tables with different column number while removing duplicates?几乎有同样的问题但是在他的情况下表格要小得多(Table1有3列而Table2有2列),所以在我的情况下SQL语句太不切实际了

是否有更实用的方法来实现这一点,也许使用VBA和SQL的组合?提前谢谢。

2 个答案:

答案 0 :(得分:2)

我觉得SQL MERGE语句是针对这种情况而设计的,但是我可以看到你可能认为定义与这些行匹配的30列中的每一列都是不切实际的。但是,我会使用类似的东西:

MERGE Table1 as t1
USING (SELECT column1, column2, column3, column4 FROM Table2) as t2
ON t1.column1 = t2.column1
, t1.column2 = t2.column2
, t1.column3 = t2.column3
, t1.column4 = t2.column4
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN
INSERT(column1, column2, column3, column4)
VALUES(t2.column1, t2.column2, t2.column3, t2.column4);
GO

我不经常使用MERGE,但我认为这是正确的。希望它有所帮助。

编辑:这仅适用于SQL Server 2008或更高版本。

答案 1 :(得分:0)

严格的VBA解决方案可能如下所示:

Dim rs As DAO.Recordset, rs1 As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("Table1Name", dbOpenDynaset)
Set rs1 = CurrentDb.OpenRecordset("Table2Name", dbOpenDynaset)

rs1.MoveFirst
Do While rs1.EOF <> True
  'In this example of FindFirst I am searching for a Date, String, and Number
  rs.FindFirst "Field1 = '" & rs1.Fields("Field1").value & "' AND " & _
               "Field2 = #" & rs1.Fields("Field2").value & "# AND " & _
               "Field3 = " & rs1.Fields("Field3").value

  'Check to see if the current rs record matches the current rs1 record
  'If not then the record in rs1 needs to be added to rs
  If (Not (rs.Fields("Field1").value = rs1.Fields("Field1").value And _
           rs.Fields("Field2").value = rs1.Fields("Field2").value And _
           rs.Fields("Field3").value = rs1.Fields("Field3").value)) Then
     rs1.AddNew
     rs1.Fields("Field1").value = rs1.Fields("Field1").value
     rs1.Fields("Field2").value = rs1.Fields("Field2").value
     rs1.Fields("Field3").value = rs1.Fields("Field3").value
     rs1.Fields("Field4").value = rs1.Fields("Field4").value
     rs1.Fields("Field5").value = rs1.Fields("Field5").value
     rs1.Fields("Field6").value = rs1.Fields("Field6").value
     rs1.Fields("Field7").value = rs1.Fields("Field7").value
     rs1.Update
  End If
  rs1.MoveNext
Loop

在上面的FindFirst语句中,用任何搜索条件替换将证明这两个表具有相同的记录。然后If语句必须与FindFirst匹配。最后,在rs1.AddNewrs1.Update之间指定要复制的所有字段。