Delete-Anweisung - Unterabfrage sollte einen Fehler auslösen

8

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

    
Orangecrush 26.12.2012, 06:05
quelle

2 Antworten

11

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.

    
Yogendra Singh 26.12.2012, 06:16
quelle
1

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

    
Dileep 26.12.2012 09:41
quelle

Tags und Links