1

2 つのデータテーブルをマージ\結合しようとしています。さまざまな例と回答を見てきましたが、重複する行を作成するか、インデックスが必要なようです(データテーブルのマージなど)

1 つのソースは MSSQL 経由でアクセスされるリンクされた Oracle サーバーからのものであり、もう 1 つはリンクされたアクセスを持たない別の MSSQL サーバーからのものであるため、SQL 経由でこれを行うことはできません。

現在、データは非常に単純です。

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"

Name はレコードを照合するフィールドで、最初のデータテーブルが優先されます。

4

4 に答える 4

1

Unionを使用してリストを結合し、リストを作成できるはずですDistinct

Distinct を機能させるには、IEqualityComparerIEqalityComparerを実装する必要があります (のオーバーロードに を渡すこともできますUnion

たとえば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
  1. 両方のデータベースに接続し、すべての比較とマージを行う小さなアプリケーション(任意のプログラム言語)を実行できます。
  2. 最初のmssqlサーバーでoracleからテーブルのクローンを作成できます。その後、最初のmssqlサーバーからデータをエクスポート/バックアップし、一時テーブルで2番目のmssqlサーバーにインポート/復元できます。その後、すべての魔法を実行できます。データのマージにSQLのみを使用する
  3. オラクルからcsvファイルでデータを直接エクスポートできます。その後、一時テーブルの2番目のmsssqlサーバーにインポートを実行し、t-sqlのみを使用してすべてのマージを実行できるようになります。
于 2012-09-03T21:36:12.537 に答える
0

すべてが失敗した場合は、いつでもUNIONを使用して 2 つのテーブルを 1 つの結果に結合できます。

select name from datatable1 where ...
UNIION ALL
select name from datatable2 where ...
于 2012-09-03T21:27:26.520 に答える
0

これは、 andを使用するため、非常に効率的なアプローチLinq-To-DataSetです。ExceptJoin

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 に答える