Announcement

Collapse
No announcement yet.

SQL Tabelle mit sich selbst vergleichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Tabelle mit sich selbst vergleichen

    Morgen.

    Ich habe eine Tabelle "Auftraege" in meinem DataWarehouse(DW), mit den Spalten [Kunden_ID](int), [Startdatum](date), [Startzeit](smallint), [Enddatum](date), [Endzeit](smallint) und [status](smallint), angelegt.
    Ich arbeite mit den SQL-Server Integration Services (SSIS) und die Daten zieht er sich aus dem operativen System(OS).

    Mein Problem: So lange ein Auftrag nicht abgeschlossen ist - enthalten die Spalten [Enddatum] und [Endzeit] noch den Wert "NULL", der [status] ist "offen".
    Diese Werte stehen auch so in meinem DW. Wenn jetzt der Auftrag abgeschlossen wird, werden im OS die NULL-werte gefüllt und der [status] auf "abgeschlossen" gesetzt.
    Wenn ich mein SSIS-Paket erneut starte, sollen alle neuen Aufträge, die noch nicht in "Auftrage" drin übernommen werden. So weit auch kein problem.

    ABER: Den geänderten - offenen Auftrag aus den OS - erkennt er auch als neuen Eintrag, weil ja Werte geändert wurden und nicht mehr mit den anderen Zeilen übereinstimmen, und schreibt mir die komplette Zeile als neue Zeile in meine DW-Tabelle. So habe ich für ein und denselben Auftrag eine Zeile ohne [Enddatum], [Endzeit] und mit [status] "offen" und eine Zeile mit [Enddatum],[Endzeit] und [status] "geschlossen"

    Wie bekomme ich es über einen SQL-Befehl hin, dass sich die Tabelle "Auftraege" mit sich selbst vergleicht? Also die gleichen [Kunden_ID], [Startdatum] und [Startzeit] sucht und bei veränderten [Enddatum], [Endzeit] und [status] die alten Zeilen löscht?
    In Excel ist das ganz einfach - aber über einen sql-Befehl stoß ich an meine Grenzen. Versucht man das Problem zu googlen bekomme ich oft den Self-Join angeboten - aber mit dem komme ich auch nicht so richtig auf nen grünen Zweig.

    Ansonsten gibt es natürlich noch immer die Möglichkeiten, dass ich vor jeden Start des SSIS-Pakets die inhalte der Auftrags-Tabelle lösche und komplett alle Werte aus dem OS neu lade, oder mir eine Mapping Tabelle schaffe über die ich die Werte eindeutig vergleichen kann. Aber das ist alles nich so schön, aber immerhin würde es funktionieren.

    Danke für's eventuelle Lesen und danke schonmal für eventuelle Hilfen.

  • #2
    Hallo OLAPStudent,

    grundsätzlich würde ich den SSIS Ablauf ändern, das die Daten eben nicht erneut übernommen, sondern die vorhandenen aktualisiert werden.

    Ansonsten hier 2 Beispiele zum Löschen; ich schätze mal, das zweite dürfte vermutlich schneller laufen.
    [highlight=SQL]DELETE FROM Auftraege
    WHERE Enddatum IS NULL
    AND Endzeit IS NULL
    AND EXISTS (SELECT 1
    FROM Auftraege AS SUB
    WHERE SUB.Kunden_ID = Auftraege.Kunden_ID
    AND SUB.Startdatum = Auftraege.Startdatum
    AND SUB.Startzeit = Auftraege.Startzeit
    AND NOT SUB.Enddatum IS NULL
    AND NOT SUB.Endzeit IS NULL)



    DELETE FROM Auftraege
    FROM Auftraege
    INNER JOIN Auftraege AS SUB
    ON SUB.Kunden_ID = Auftraege.Kunden_ID
    AND SUB.Startdatum = Auftraege.Startdatum
    AND SUB.Startzeit = Auftraege.Startzeit
    AND NOT SUB.Enddatum IS NULL
    AND NOT SUB.Endzeit IS NULL
    AND Auftraege.Enddatum IS NULL
    AND Auftraege.Endzeit IS NULL[/highlight]
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Tausend dank. Ich glob darauf wär ich selber nie gekommen. Funktioniert einwandfrei.

      Wenn ich die vorhandenen Daten "nur" aktualisieren lassen wollen würde, würde das dann so viel anders aussehen? wäre doch an sich nur ne Insert-Anweisung, die nach den gleichen Übereinstimmungen bzw Fehlwerten sucht und in der Zeile dann die neuen Werte zu den Spalten hinzufügt, oder? ich glob das probier ich mal aus.

      Danke nochmals.

      Comment

      Working...
      X