Ich habe zwei Tabellen erstellt, T1 und T2 mit jeweils einer Spalte, abc und xyz. Ich habe 2 Zeilen (numerische Werte 1 und 2) in jede Tabelle eingefügt.
Wenn ich den Befehl "select abc from t2"
ausführe, wird ein Fehler ausgegeben, der besagt, dass die Spalte abc in der Tabelle T2 nicht existiert. Wenn ich jedoch den Befehl "delete from t1 where abc in (SELECT abc from t2);"
ausführen, werden 2 Zeilen gelöscht.
Sollte das Löschen nicht fehlschlagen, da ich dieselbe Anweisung verwendet habe, die in der Unterabfrage fehlgeschlagen ist?
create table t1 (abc-Nummer); - Tabelle erstellt
create table t2 (xyz-Nummer); - Tabelle erstellt
Einfügen in t1-Werte (1); - Eine Zeile eingefügt
Einfügen in t1-Werte (2); - Eine Zeile eingefügt
Einfügen in t2-Werte (1); - Eine Zeile eingefügt
Einfügen in t2-Werte (2); - Eine Zeile eingefügt
SELECT abc von t2; - ORA-00904 - & gt; Weil die Spalte abc in t2 nicht existiert
lösche von t1 wo abc in (SELECT abc von t2); - 2 Zeilen gelöscht
Wenn Sie die Tabellennamen als Alias verwenden, um sicherzustellen, dass die Tabelle t2-Spalte ausgewählt wird, erhalten Sie den Fehler, z. B.
%Vor% Ihre ursprüngliche Abfrage ist nicht fehlgeschlagen, weil sie die abc
-Spalte der Tabelle t1
verwendet, da die Tabelle t1
in der Unterabfrage sichtbar ist.
Ihre Delete-Anweisung funktioniert aufgrund des abc-Spaltennamens, den Sie in der Where-Bedingung verwendet haben. Unterabfrage wird basierend auf der WHERE-Bedingungsspalte ausgeführt, becz verwenden wir den Tabellenaliasnamen nicht.
Wenn Sie diese Abfragen sehen
wähle * aus t1, wobei abc in (SELECT abc von t2); - Es wird 2 Zeilen geben
wähle * von t1, wo abc in (SELECT 1 von t2); - Es gibt 1 Reihe
Wählen Sie * aus t1, wobei abc in (SELECT 2 von t2); - Es wird die zweite Zeile abrufen
Wählen Sie * aus t1, wo abc in (SELECT 3 von t2); - Keine Daten erhalten
wähle * von t1 wo abc in (SELECT hg von t2); - Ungültiger Bezeichner
Tags und Links sql oracle subquery delete-row