Ich habe die Geige ziemlich drastisch reduziert, aber ich denke, die Absicht scheint durch. [Def]
ist eine [DefaultClassification]
Tabelle und [Cls]
eine [Classification]
Tabelle mit einigen alten Datensätzen, die hinzugefügt werden müssen. Die DefaultClassification-Tabelle wird in Zukunft verwendet, um neue Gruppen von Datensätzen in einer weiteren Tabelle zu erzeugen, und wir "brechen" ein vorhandenes Bit auf von Logik / Daten mit diesem Prozess.
Ich habe mein Bestes getan, um das Ganze auf das Wesentliche zu reduzieren, aber ich habe einen ähnlichen Prozess, der direkt nach diesem ausgeführt wird. Daher möchte ich bewährte Methoden kennenlernen und herausfinden, warum diese Abfrage fehlerhaft ist.
Als ich dies schrieb, wollte ich, dass es in einer Umgebung ab 2008 ausgeführt wird, skriptgesteuert oder manuell in SSMS. Ich weiß nicht, dass es kein Skript gibt, aber es könnte sein. Im Moment wird es komplett von Hand betrieben. Das Rollback und die Auswahl oben über den Drucknachrichten am Ende sind darauf zurückzuführen, dass es nicht richtig funktioniert. Daher kann ich es vor dem Festschreiben überprüfen. Ich würde jedoch ein gültiges Skript bevorzugen, mit dem ich mich nicht herumschlagen muss
Das spezifische Problem, das ich habe, befindet sich in Zeile 62 dieses Revisions-1-Links http://sqlfiddle.com/#!3/ef71e/1 und es sieht folgendermaßen aus:
RECHTE AUSSENVERBINDUNG [Def] tcd
Wenn ich das RECHTS nach LINKS drehe, wird die Einfügung ausgeführt, es werden jedoch keine Duplikate erkannt (um das Einfügen zu verhindern). Wenn ich das RECHTE mache, werden Duplikate erkannt, aber keine Einfügungen verarbeitet.
Was habe ich gebrochen? Und warum?
Und mir wurde gesagt, dass die Verwendung des @@ERROR
Juju schlecht war, aber ich weiß nicht warum, also Bonuspunkte (ein Kopfgeld von 100 Wiederholungen) auch für diese Erklärung.
quelle
Ok, ich schrieb einen Artikel über SQL Server - Zentral hier , dass Sie mit der linken / rechten äußeren Fragen verbinden helfen können. Wenn Sie jedoch in diesem Fall versuchen, Duplikate zu entfernen, denke ich, dass das, wonach Sie suchen, NICHT vorhanden ist.
Ihr vorhandener Code, der RIGHT OUTER JOIN verwendet, enthält eine WHERE-Klausel in der Tabelle LEFT. Da Sie NULL-Werte ausschließen und immer dann, wenn es keine Übereinstimmung gibt, einen RECHTEN AUSSEN-JOIN erhalten, erhalten Sie einen NULL-Wert für die Tabelle LINKS. Die Verwendung von NOT EXISTS sollte mehr helfen. Ihre Testdaten enthalten jedoch keine Duplikate, sodass es schwer zu sagen ist.
quelle
Sie können nicht einfach die rechten und linken Verknüpfungen tauschen. Sie bedeuten zwei verschiedene Dinge. Sie müssen auch verstehen, wie sich eine where-Bedingung auf der Tabelle auf der linken Seite eines rechten Joins oder auf der rechten Seite eines linken Joins auswirkt. Unter diesem Link erfahren Sie, warum sich der Join in einen inneren Join ändert. http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN
Überprüfen Sie, ob dieser Code Ihren Wünschen entspricht:
Für die Zukunft ist es im Allgemeinen am besten, nur linke Verknüpfungen zu verwenden.
quelle