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

Posted

技术标签:

【中文标题】如何合并具有不同列号的两个表,同时删除具有大量列的表的重复项【英文标题】:How do I merge two tables with different column number while removing duplicates for tables with a large number of columns 【发布时间】:2013-10-04 15:12:11 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

我觉得 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 或更高版本。

【讨论】:

【参考方案2】:

严格的 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 之间指定要复制的所有字段。

【讨论】:

以上是关于如何合并具有不同列号的两个表,同时删除具有大量列的表的重复项的主要内容,如果未能解决你的问题,请参考以下文章

如何在火花中合并或连接具有不相等列号的数据框

找出oracle中具有不同列号的2个表之间的区别

如何在R中将2个具有不同行和列号的表组合在一起

如何在 Python 中合并多个具有不同表格列的 Excel 工作表?

在 Dataflow 中使用啥转换来合并具有不同列的 csv 文件,同时将它们加载到 BigQuery?

如何使用sql从具有不同列的两个表中获取不同的记录