Zugriff - Zusammenführen von zwei Datenbanken mit identischer Struktur

3475
carillonator

Ich möchte eine Abfrage schreiben, die zwei Access 2000-Datenbanken in einer zusammenführt. Jede hat 35 Tabellen mit identischen Feldern und größtenteils eindeutigen Daten. Es gibt einige Zeilen, die denselben "Primärschlüssel" haben. In diesem Fall sollte die Zeile aus Datenbank A immer Vorrang vor Datenbank B haben. Ich verwende Anführungszeichen um "Primärschlüssel", da die Datenbanken ohne Schlüssel oder Beziehungen generiert werden. Zum Beispiel:

Datenbank A, Tabelle1

col1 col2 Frank red Debbie blue 

Datenbank B, Tabelle1

col1 col2 Harry orange Debbie pink 

Und die Ergebnisse möchte ich:

col1 col2 Frank red Harry orange Debbie blue 

Diese Datenbanken werden von nicht-SQL-versierten Benutzern generiert und heruntergeladen. Daher möchte ich ihnen einfach eine Abfrage zum Kopieren und Einfügen geben. Sie müssen natürlich damit beginnen, einen DB [in] mit einem anderen zu importieren oder zu verknüpfen.

Ich schätze, ich muss eine dritte Tabelle mit der kombinierten Ergebnisabfrage erstellen und die anderen beiden dann löschen. Im Idealfall würde es jedoch nur die Tabellen der Datenbank B und das Hinzufügen der Datenbank A (wenn nötig überschreiben) erfordern.

Ich bin natürlich nicht auf der Suche nach einer vollständigen Antwort, sondern hoffe auf Ratschläge, wo ich anfangen soll. Ich habe einige Erfahrung mit MySQL und verstehe die Grundlagen von Joins. Kann man das alles in einer Abfrage machen, oder muss ich für jede Tabelle eine eigene haben?

1

3 Antworten auf die Frage

2
mtone

Ich bin nicht mit dem Zugriff vertraut, aber in generischem SQL würde ich es so machen:

SELECT col1, col2 from TableA UNION SELECT col1, col2 from TableB where col1 not in (select col1 from TableA) 

Dies wird Debbie in TableA den Vorzug geben. Grundsätzlich verbinden Sie die gesamten beiden Tabellen nacheinander mit UNION. Bevor Sie jedoch TableB hinzufügen, entfernen Sie den Inhalt von col1, der bereits in Table1 vorhanden ist.

EDIT: Ich spreche nur von zwei Tabellen, nicht von zwei Datenbanken. Sie können die Idee jedoch für jede Tabelle replizieren, solange keine kollidierenden Beziehungen bestehen.

EDIT2: Wenn Sie TableA direkt ändern möchten, können Sie INSERT verwenden (beachten Sie, dass Sie den ursprünglichen TableA auf diese Weise nicht abrufen können, es sei denn, Sie fügen zusätzliche Informationen in einer neuen Spalte hinzu, um den Vorgang zu verfolgen.)

INSERT INTO TableA (col1, col2)  SELECT col1, col2 from TableB  WHERE col1 not in (select col1 from TableA) 
1
Kenneth Cochran

Leider ist dies nicht mit einer einzelnen Abfrage möglich.

Es gibt einige gute Werkzeuge zum Zusammenführen von Datenbanken, die dabei helfen werden:

  • Altova DatabaseSpy
  • RedGate SQL Data Compare

Offensichtlich stellt die Lizenzierung eines kommerziellen Tools ein Problem dar, wenn Sie beabsichtigen, Ihren Kunden etwas zu geben.

Ein Werkzeug selbst zu schreiben ist immer eine Option, aber das Zusammenführen von Datenbanken ist nicht gerade eine triviale Operation. In diesem Beitrag können Sie einen Blick auf stackoverflow werfen, in dem einige der Probleme beschrieben werden, mit denen Sie möglicherweise konfrontiert sind. Sie haben möglicherweise eine noch schlechtere Zeit, da Ihre Datenbank keine referenzielle Integritätsprüfung verwendet. Sie können auch in ETL-Tools nachschlagen . Nicht unbedingt für ein Zusammenführungsszenario konzipiert, aber möglicherweise finden Sie etwas, das die Aufgabe erfüllt.

0
David W. Fenton

Aufgrund von Fremdschlüsseln müssen Sie die alten PKs in der kombinierten Tabelle nachverfolgen. Ich erstelle in diesem Fall immer eine OldID-Spalte und füge die übergeordneten Datensätze an die Tabelle an, wobei der ursprüngliche PK an das OldID-Feld angehängt ist. Dann kann ich diese OldID verwenden, um eine Verknüpfung zu den untergeordneten Datensätzen herzustellen und sie mit dem neuen PK-Wert anzufügen.