1

我正在尝试合并\组合两个数据表。我查看了各种示例和答案,但它们似乎创建了重复的行或需要索引(合并数据表等)

我不能通过 SQL 执行此操作,因为一个源来自通过 MSSQL 访问的链接 Oracle 服务器,另一个来自没有链接访问的不同 MSSQL 服务器。

目前数据很简单:

Name, Email, Phone

数据表1:

"John Clark", "", "01522 55231"
"Alex King", "alex.king@somecompany.com", "01522 55266"
"Marcus Jones", "marcus.jones@somecompany.com", "01522 55461"

数据表2:

"John Clark", "john.clark@somecompany.com", "01522 55231"
"Alex King", "alex.king@somecompany.com", ""
"Marcus Jones", "marcus.jones@somecompany.com", "01522 55461"
"Warren bean", "warren.bean@somecompany.com", "01522 522311"

提供具有以下内容的数据表:

"John Clark", "john.clark@somecompany.com", "01522 55231"
"Alex King", "alex.king@somecompany.com", "01522 55266"
"Marcus Jones", "marcus.jones@somecompany.com", "01522 55461"
"Warren bean", "warren.bean@somecompany.com", "01522 522311"

名称是匹配记录的字段,第一个数据表优先。

4

4 回答 4

1

您应该能够使用 组合列表Union,然后制作列表Distinct

为了使 Distinct 正常工作,您需要实现IEqualityComparer(您也可以将 an 传递IEqalityComparerUnion.

例如 - 假设您Person从每个来源获得相同类的列表:

Dim allList = dataTable1List.Union(dataTable2List).Distinct(New PersonComparer())

一个例子PersonComparer可能是:

Public Class PersonComparer
    Implements IEqualityComparer(Of Person)

    Public Overloads Function Equals(ByVal a As Person, ByVal b As Person) As Boolean Implements IEqualityComparer(Of Person).Equals
        Return a.Name = b.Name
    End Function
    Public Overloads Function GetHashCode(ByVal a As Person) As Integer Implements             IEqualityComparer(Of Person).GetHashCode
        Return a.GetHashCode()
    End Function
End Class
于 2012-09-03T21:27:36.483 回答
0

如果一切都失败了,您始终可以使用UNION将 2 个表合并为 1 个结果。

select name from datatable1 where ...
UNIION ALL
select name from datatable2 where ...
于 2012-09-03T21:27:26.520 回答
0
  1. 您可以做一个小型应用程序(使用任何编程语言),它将连接到两个数据库并进行所有比较和合并的工作。
  2. 您可以在第一个 mssql 服务器中从 oracle 克隆您的表,然后您可以从第一个 mssql 服务器导出/备份您的数据并导入/恢复到临时表中的第二个 mssql 服务器,之后您可以通过仅使用 sql 来合并数据
  3. 您可以在 csv 文件中直接从 oracle 导出数据,之后您将导入到临时表中的第二个 msssql 服务器,然后您将能够仅使用 t-sql 进行所有合并
于 2012-09-03T21:36:12.537 回答
0

这是一种Linq-To-DataSet应该非常有效的方法,因为它使用Exceptand Join

Dim t1Names = From t In table1 Select t.Field(Of String)("Name")
Dim t2Names = From t In table2 Select t.Field(Of String)("Name")
Dim newt2Names = t2Names.Except(t1Names)
Dim newT2Rows = From t2 In table2
               Join newName In newt2Names
               On t2.Field(Of String)("Name") Equals newName
               Select t2
Dim updates = From t1 In table1
             Join t2 In table2
             On t1.Field(Of String)("Name") Equals t2.Field(Of String)("Name")
             Where  t1.Field(Of String)("Email") <> t2.Field(Of String)("Email") _
             OrElse t1.Field(Of String)("Phone") <> t2.Field(Of String)("Phone")
For Each newt2 As DataRow In newT2Rows
    Dim newT1 = table1.Rows.Add()
    newT1.ItemArray = newt2.ItemArray
Next
For Each u In updates
    If String.IsNullOrEmpty(u.t1.Field(Of String)("Email")) Then
        u.t1.SetField("Email", u.t2.Field(Of String)("Email"))
    End If
    If String.IsNullOrEmpty(u.t1.Field(Of String)("Phone")) Then
        u.t1.SetField("Phone", u.t2.Field(Of String)("Phone"))
    End If
    If String.IsNullOrEmpty(u.t2.Field(Of String)("Email")) Then
        u.t2.SetField("Email", u.t1.Field(Of String)("Email"))
    End If
    If String.IsNullOrEmpty(u.t2.Field(Of String)("Phone")) Then
        u.t2.SetField("Phone", u.t1.Field(Of String)("Phone"))
    End If
Next

请注意,如果您还想将新行从 table1 添加到 table2,它可能不完整,但我希望它能给您一个想法。

编辑:这是您的示例数据(如果有人想测试):

Dim table1 = New DataTable
Dim table2 = New DataTable
table1.Columns.Add("Name")
table1.Columns.Add("Email")
table1.Columns.Add("Phone")
table2.Columns.Add("Name")
table2.Columns.Add("Email")
table2.Columns.Add("Phone")
table1.Rows.Add("John Clark", "", "01522 55231")
table1.Rows.Add("Alex King", "alex.king@somecompany.com", "01522 55266")
table1.Rows.Add("Marcus Jones", "marcus.jones@somecompany.com", "01522 55461")

table2.Rows.Add("John Clark", "john.clark@somecompany.com", "01522 55231")
table2.Rows.Add("Alex King", "alex.king@somecompany.com", "")
table2.Rows.Add("Marcus Jones", "marcus.jones@somecompany.com", "01522 55461")
table2.Rows.Add("Warren bean", "warren.bean@somecompany.com", "01522 522311")
于 2012-09-03T21:52:41.257 回答