Ich mache einige Wartungsarbeiten an einer Datenbankanwendung und habe festgestellt, dass aus Freude, obwohl Werte aus einer Tabelle im Stil von Fremdschlüsseln verwendet werden, keine Fremdschlüsseleinschränkungen für die Tabellen gelten.
Ich versuche, FK-Einschränkungen für diese Spalten hinzuzufügen, aber ich stelle fest, dass ich die Zeilen finden muss, die dies nicht tun, da die Tabellen bereits eine ganze Menge fehlerhafter Daten aus früheren Fehlern enthalten, die naiv korrigiert wurden stimmen Sie mit der anderen Tabelle überein und löschen Sie sie dann.
Ich habe einige Beispiele für diese Art von Abfrage im Web gefunden, aber alle scheinen eher Beispiele als Erklärungen zu liefern, und ich verstehe nicht, warum sie funktionieren.
Kann mir jemand erklären , wie eine Abfrage zu erstellen , die alle Zeilen ohne Treffer in einer anderen Tabelle zurückgibt, und was es tut, so dass ich mich diese Fragen machen können, anstatt für jede Tabelle zu SO in diesem laufenden kommenden Chaos , das hat Keine FK-Einschränkungen?
quelle
NULL
ID in Ihrem Schema gültig ist, haben Sie möglicherweise größere Probleme, würden Sie nicht zustimmen? :)SELECT t1.ID, t2.ID
die Zeile WHERE ändern und diese entfernen, erhalten Sie eine bessere Vorstellung davon, wie dies funktioniert.Ich würde
EXISTS
Ausdruck verwenden, da er leistungsfähiger ist. Sie können also genauer Zeilen auswählen, denen Sie beitreten möchten, fallsLEFT JOIN
Sie alles nehmen müssen, was in der verknüpften Tabelle enthalten ist. Die Effizienz ist wahrscheinlich die gleiche wie bei einemLEFT JOIN
Nulltest.quelle
EXISTS
ist seine Variabilität.WHERE t2.id IS NULL
) Danke.Tabelle 1 enthält eine Spalte, zu der Sie die Fremdschlüsseleinschränkung hinzufügen möchten. Die Werte in Tabelle 1
foreign_key_id_column
stimmen jedoch nicht mit denenid
in Tabelle 2 überein .id
s aus Tabelle1 auf. Dies sind die Zeilen, die wir löschen möchten.NOT IN
Klausel in der where-Anweisung beschränkt die Abfrage auf nur Zeilen, in denen der Wert in derforeign_key_id_column
nicht in der Liste der Tabelle 2id
s enthalten ist.SELECT
Anweisung in Klammern enthält eine Liste allerid
s in Tabelle 2.quelle
IN
Klausel mit einer Liste von Literalwerten zu tun .IN
Dies gilt nicht für die Verwendung einer Klausel mit dem Ergebnis einer Unterabfrage. Diese akzeptierte Antwort auf diese Frage löst das Problem tatsächlich mithilfe einer Unterabfrage. (Eine große Liste von Literalwerten ist problematisch, weil sie einen großen SQL-Ausdruck erzeugt. EineWo
T2
ist die Tabelle, zu der Sie die Einschränkung hinzufügen:Und löschen Sie die Ergebnisse.
quelle
Lassen Sie uns die folgenden 2 Tabellen haben (Gehalt und Angestellter)
Jetzt möchte ich die Datensätze aus der Mitarbeitertabelle, die nicht im Gehalt sind. Wir können dies auf drei Arten tun:
quelle
Aus einer ähnlichen Frage hier MySQL Inner Join-Abfrage, um Datensätze zu erhalten, die in einer anderen Tabelle nicht vorhanden sind Ich habe dies zum Laufen gebracht
smalltable
Hier haben Sie fehlende Datensätze.bigtable
Dort haben Sie alle Datensätze. Die Abfrage listet alle Datensätze auf, die nicht vorhanden sind,smalltable
aber auf dem vorhanden sindbigtable
. Sie könnenid
durch andere Übereinstimmungskriterien ersetzen .quelle
Sie können sich wie unten gezeigt für Ansichten entscheiden :
und arbeiten Sie dann an der Ansicht zum Auswählen oder Aktualisieren:
Dies ergibt das Ergebnis wie in der Abbildung unten gezeigt, dh für eine nicht übereinstimmende Spalte wurde Null ausgefüllt.
quelle
Ich wusste nicht, welches optimiert ist (im Vergleich zu @AdaTheDev), aber dieses scheint schneller zu sein, wenn ich es benutze (zumindest für mich)
Wenn Sie ein anderes spezifisches Attribut erhalten möchten, können Sie Folgendes verwenden:
quelle
SELECT * FROM First_table MINUS SELECT * FROM ein anderer
quelle
Sie können so etwas tun
quelle
Wie wähle ich Zeilen ohne übereinstimmenden Eintrag in der Tabelle Beide aus?
quelle