MERGE-Befehl - Hilfe bei TARGET-Zeile löschen nach UPDATE/INSERT

Romero

Aktiver Benutzer
Beiträge
46
Hallo zusammen,

leider komm ich bei einer MERGE-Abfrage nicht weiter und ersuche eure Hilfe.

Dazu habe ich schon 2 Versuche (siehe unten) gestartet, wo entweder die TARGET-Zeile stehen bleibt, oder die Meldung kommt, dass die MERGE-Anweisung versucht hat, die TARGET-Zeile mehr als einmal zu aktualisieren /zu löschen.

Hier erstmal meine TARGET- / SOURCE-Tabellen (Kurzform):

TARGET
AuftragArbeitsschrittIDWertBemerkung
801234560001NULLNULLNULL

SOURCE
AuftragArbeitsschrittIDWertBemerkung
801234560001ABC000120PAUSE
801234560001ABC000230STOPP

Endergebnis soll sein
AuftragArbeitsschrittIDWertBemerkung
801234560001ABC000120PAUSE
801234560001ABC000230STOPP

Nun meine MERGE-Anweisung:

Versuch 1
SQL:
MERGE INTO [dbo].[Tabelle_1] AS TARGET
USING (SELECT Auftrag, Arbeitsschritt, Wert, Bemerkung) AS SOURCE
ON TARGET.[Auftrag] = SOURCE.[Auftrag] AND
      TARGET.[Arbeitsschritt] = SOURCE.[Arbeitsschritt] AND
      ISNULL(TARGET.[ID], '0') = ISNULL(SOURCE.[ID], '0')
WHEN MATCHED AND
      ISNULL(TARGET.[ID], '0') <> SOURCE.[ID] OR
      ISNULL(TARGET.[Wert], 0) <> SOURCE.[Wert] OR
      ISNULL(TARGET.[Bemerkung], '') <> SOURCE.[Bemerkung]
THEN UPDATE
SET TARGET.[ID] <> SOURCE.[ID],
      TARGET.[Wert] <> SOURCE.[Wert],
      TARGET.[Bemerkung] <> SOURCE.[Bemerkung]
WHEN NOT MATCHED BY TARGET
THEN INSERT (Auftrag, Arbeitsschritt, ID, Wert, Bemerkung)
VALUES (SOURCE.[Auftrag], SOURCE.[Arbeitsschritt], SOURCE.[ID], SOURCE.[Wert], SOURCE.[Bemerkung])
;

Ergebnis
AuftragArbeitsschrittIDWertBemerkung
801234560001NULLNULLNULL
801234560001ABC000120PAUSE
801234560001ABC000230STOPP

Versuch 2
SQL:
MERGE INTO [dbo].[Tabelle_1] AS TARGET
USING (SELECT Auftrag, Arbeitsschritt, Wert, Bemerkung) AS SOURCE
ON TARGET.[Auftrag] = SOURCE.[Auftrag] AND
      TARGET.[Arbeitsschritt] = SOURCE.[Arbeitsschritt] AND
      CASE WHEN ISNULL(TARGET.[ID], '0') = '0' THEN 1
               WHEN TARGET.[ID] = SOURCE.[ID] THEN 1
      END = 1
WHEN MATCHED AND
      ISNULL(TARGET.[ID], '0') <> SOURCE.[ID] OR
      ISNULL(TARGET.[Wert], 0) <> SOURCE.[Wert] OR
      ISNULL(TARGET.[Bemerkung], '') <> SOURCE.[Bemerkung]
THEN UPDATE
SET TARGET.[ID] <> SOURCE.[ID],
      TARGET.[Wert] <> SOURCE.[Wert],
      TARGET.[Bemerkung] <> SOURCE.[Bemerkung]
WHEN NOT MATCHED BY TARGET
THEN INSERT (Auftrag, Arbeitsschritt, ID, Wert, Bemerkung)
VALUES (SOURCE.[Auftrag], SOURCE.[Arbeitsschritt], SOURCE.[ID], SOURCE.[Wert], SOURCE.[Bemerkung])
;

Ergebnis
Die MERGE-Anweisung hat versucht, dieselbe Zeile mehr als einmal zu aktualisieren oder zu löschen. ...


Nun also die Frage: wie bekomme ich das obige Ergebnis hin, dass sowohl die "NULL"-TARGET-Zeile geupdatet wird, sowie die weitere SOURCE-Zeile geINSERT wird?
Oder müsste ich im Nachgang diese "NULL-TARGET-Zeile" separat löschen?

Sollte bereits die TARGET-Zeile entsprechend befüllt sein...
AuftragArbeitsschrittIDWertBemerkung
801234560001ABC000140PAUSE
...dann funktioniert die UPDATE- als auch die INSERT-Funktion der MERGE-Anweisung (beide o.g. Versuche).

LG Romero
 
Werbung:
Werbung:
Hallo t-sql,

vielen Dank für deinen Post.
Ich dachte gerade, dass der MERGE-Statement genau meine Problematik abwickelt.

wieder was gelernt :-)

Dennoch habe ich meine Problematik nach langem Hin und Her wie folgt gelöst:

SQL:
WITH    A2E_DataGroup([ID], [Auftrag]) AS
        (
             SELECT    DISTINCT A2E.[ID], A2E.[Auftrag]
             FROM    [dbo].[Tabelle1] AS A2E
             WHERE    A2E.[ID] <> 0
        )


DELETE  A2E
FROM    [dbo].[Tabelle1] AS A2E     INNER JOIN
        A2E_DataGroup AS A2E_DG     ON A2E_DG.[Auftrag] = A2E.[Auftrag]
                                    AND A2E_DG.[ID] = A2E.[ID]
WHERE   ISNULL(A2E.[ID], 0) = 0


GO

LG Romero
 
Zurück
Oben