Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#3

Re: Zwei SQL-Datenbanken abgleichen, WIE?

  Alt 20. Sep 2004, 00:42
Zitat von aschne1:
Geht das nicht mit der SQL-Anweisung UNION ?
Eher MINUS (bzw. UNION um die zu löschenden DS hinten "ranzuklatschen" )

Da die Infos etwas spärlich sind, nehme ich für mein Beispiel an, dass die Spalten A & B eindeutig sein müssen (zum Bleistift Vorname & Nachname), möglicherweise reicht dir auch eine Art Kundennummer.

SQL-Code:
SELECT Decode(k.A
             ,NULL
             ,1 /* kein Wert in Kunden -> INSERT */
             ,2) DmlType /* andernfalls         -> UPDATE */
      ,Decode(k.A /* Der PK wird nur für's UPDATE gebraucht ;) */ 
             ,NULL
             ,-1
             ,k.PK) PK
      ,sQ.A
      ,sQ.B
      ,sQ.C
FROM (SELECT A, B, C
       FROM WinLine
       MINUS
       SELECT A, B, C /* alle Datensätze aus WinLine, */
       FROM Kunden) sQ /* die so nicht in Kunden enthalten sind */
       LEFT JOIN Kunden k
       ON k.A = sQ.A and /* deshalb Eindeutigkeit von A & B ;) */
          k.B = sQ.B
UNION ALL
SELECT 3 DmlType /* alle Datensätze aus Kunden, */
      ,k.PK /* die in WinLine nicht mehr da sind */ 
      ,k.A /* -> löschen */
      ,k.B
      ,k.C
FROM Kunden k
WHERE not EXISTS (SELECT IrgendWas
                   FROM WinLine
                   WHERE k.A = sQ.A and
                          k.B = sQ.B)
Beispiel:
  • Kunden
    Code:
    PK A  B  C
    1   AA BB 1
    3   BB CC 3
    WinLine
    Code:
    PK A  B  C
    4   DD EE 5
    6   BB CC 2
    Sollte ergeben:
    Code:
    DmlType PK A  B  C
    1        -1  DD EE 5   -> INSSERT
    2        3   BB CC 3   -> UPDATE  
    3        1   AA BB 1   -> DELETE

Zitat von aschne1:
Ausserdem denke ich beim Ausdruck Schnittmenge an Redunanzen. Musst Du die Daten ableichen oder lässt sich das auch mit einer Verknüpfung lösen?
Deshalb MINUS
Zitat von aschne1:
Für zwei Datenbanken brauchst Du auch zwei ADOConnections.
Das hätte eine ziemlich krasse Anzahl von Roundtrips zur Folge.
Da ich absolut null (naja vielleicht 0,01 ) Ahnung vom SQL Svr habe muss ich jetzt mal fragen: Kann der SQL Svr DB-Links?
  • Wenn ja:
    Melde dich in der DB an, für die du einen DBLink zur anderen gelegt hast. (eine Connection)
    Ergänze die nötige Syntax in der Abfrage
    In Ora sieht sowas so aus (DB von X hat einen DBLink Lnk auf die DB von Y):
    SQL-Code:
    SELECT A, B, C
    FROM X
    MINUS
    SELECT A, B, C
    FROM Y@Lnk
    Vielleicht ist es im SQL Svr nicht so sehr verschieden (wobei das @ bei euch IMHO nur für Parameter verwendet wird)
  • Wenn NICHT:
    Lege beides in EINE DB! (auch eine Connection)
    Die Trennung, auf 2 DBs, macht IMHO nur dann Sinn, wenn du innerhalb des Servers von einer DB auf die andere kommst.

Wirklich Licht ins Dunkel wird wohl nur ein Profi für den SQL Svr sein. (Um die Zeit dürfte sich Leusel durch die DP schleichen. )

p.s.: Hui, war vielleicht etwas zuviel des Guten....
  Mit Zitat antworten Zitat