SQL Update mit Fall, entweder zuweisen oder nichts tun
Kommen aus der Rückseite dieser Frage hier, ist es ein Weg, um ein CASE
- Anweisung in einer SQL - UPDATE
dass entweder update oder nichts tut. Derzeit habe ich die folgenden:
UPDATE CustomerAddress
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE 0 END
FROM CustomerAddress
join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master]
join CustomerAddress c2 on p1.[Id to delete]=c2.Id
Entsteht das problem in dieser Zeile:
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE **0** END
Wenn ich es auf 0, sonst. Der update-check sollte die erste Bedingung, und wenn ja, auf 1 gesetzt, ist aber, wenn die Bedingung nicht erfüllt ist, ich möchte nicht auf 0 gesetzt, muss ich behalten den ursprünglichen Wert.
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE *CustomerAddress.IsPrimary* END
Nicht funktioniert aber, denn es bekommt den Wert aus der FROM
- Anweisung, dann eher den Wert, den es hat momentan zu. Was ich will, ist so etwas wie das
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE *Do nothing* END
Aber das ist noch eine Aufgabe, und versucht zu NULL
.
Ist das oben möglich?
UPDATE:
Beispieldaten:
paar von ID ist, die Sie vertreten-Adresse als so
ID to keep ID to delete
------------------------
10 21
10 22
11 31
12 41
Konzentriere ich mich auf das, was passiert mit dem 10. So 10 IsPrimaryAddress=0
, 21 hat IsPrimaryAddress=1
, und 22 hat IsPrimaryAddress=0
.
Was ich glaube, passiert ist dies (in pseudocode):
Set IsPrimaryAddress = wenn 21.IsPrimaryAddress=1, dann Satz zu 21.IsPrimaryAddress sonst auf 10 gesetzt.IsPrimaryAddress
Daher haben wir 10.IsPrimaryAddress zu 1. Jetzt:
Set IsPrimaryAddress = wenn 22.IsPrimaryAddress=1, dann Satz zu 22.IsPrimaryAddress sonst auf 10 gesetzt.IsPrimaryAddress
Denen ich hoffen würde, 10.IsPrimaryAddress gleich 1 ist. Aber es scheint, um die original-Wert 0, und jetzt das update verloren gegangen ist.
FROM
vs. "der Wert ist aktuell eingestellt"?Siehe mein Kommentar auf deine Antwort, hoffentlich wird das erklären, was ich denke, passiert.
Bitte posten Sie sample-Daten in die beiden Tabellen und das, was Sie wollen, dass die source-Tabelle Aussehen nach. Word-Probleme und Theorien sind schwer zu lösen.
Wenn Sie eine Menge von update-Abfragen, Blick in die MERGE-Anweisung. Es ermöglicht es Ihnen, explizit zu verarbeiten, was passiert, wenn Sie übereinstimmen/nicht übereinstimmen. Leider Onlinedokumentation ist eine Art ... ich fand es dichter als gewohnt an das Thema. Denken Sie daran, "MIT" bedeutet "VERBINDEN" und es könnte schneller gehen für Sie. Check dieser und dieser wenn Sie interessiert sind
Danke ich werde das prüfen, ich habe gesehen, es kommen ein paar mal, aber um ehrlich zu sein, ich schaute über es und dachte: 'ich komme später noch darauf zurück...'
InformationsquelleAutor dann.dev | 2012-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur eine WHERE-Klausel hinzufügen, so dass Sie nur aktualisieren Sie die Zeilen, die aktualisiert werden müssen:
Dieser Weg sollte auch effizienter sein, zum Beispiel, es wird nicht alles schreiben, wenn es sich um keine abhängigen primären Adressen.
ja, es ist definitiv eine bessere Weise, das Gefühl habe, ich habe versucht Sie zu heikel mit meiner SQL in letzter Zeit, nicht denke, es wäre eine CASE-Anweisung, die mir aber!
InformationsquelleAutor Neil
PS: ich bin mir nicht sicher über Tabelle name, sondern die Idee ist, die Rückkehr der Spalte ein Wert an sich, es zu verlassen unverändert, dies ist eine gängige Praxis.
IsPrimaryAddress
ist ambiguious, ist dies, weil die CustomerAddress Tabelle zweimal in den joinNur Präfix von Tabellennamen, die
CustomerAddress
oder ist das so richtig?!Dann bekomme ich das problem mit Aarons Antwort, wo es kann der falsche Wert, denn es ist nicht auf der Suche auf die Werte zu aktualisieren, sondern die
From
- AnweisungSie gehen zu müssen, um zu zeigen, ein Beispiel, denn ich glaube nicht, dass viele Menschen verstehen, was Sie bedeuten.
Ich habe einige Beispiel-Daten, was ich denke, geschieht, und ich meine wirklich 'denken' ich bin kein sql guru, aber ich habe mehrere Male ausführen, wie oben und immer unterschiedliche Antworten, die die Theorie stützen
InformationsquelleAutor sll
ELSE c.IsPrimaryAddress
die nicht den Blick auf die update-Daten, und setzen Sie es zurück auf 0, das ist nicht das, was ich will.Ein einzelnes update nicht machen sollte mehrere Durchgänge an der gleichen Tabelle. Haben Sie Ihre Theorie bestätigt ist, oder ist es nur eine Theorie? Können Sie einige Beispiel-Daten in die Basis-und die #temp-Tabelle, die veranschaulicht diese?
InformationsquelleAutor Aaron Bertrand