2017-12-14 3 views
0

Die Abfrage:
SELECT COLUMN_NAME VON MY_TABLE Return ORA-00904 Ungültige Kennung, weil es keine COLUMN_NAME Spalt in MY_TABLE ist, weit so so gut.

Die Abfrage:
SELECT * FROM OTHER_TABLE WHERE COLUMN_NAME IN
Nicht nur, dass es nicht scheitern, gibt es die komplette OTHER_TABLE (COLUMN_NAME FROM MY_TABLE SELECT). Dies geschieht nur, wenn die interne Abfrage eine Spalte auswählt, die sich in der Tabelle "außerhalb" befindet.
Wenn ich die gleiche Abfrage ausführen, und nur die interne Abfrage ändern Spalte in andere Spalte auswählen, die auch nicht in der Tabelle vorhanden ist, aber auch nicht in der Tabelle in der äußeren Tabelle vorhanden ist,
SELECT * FROM OTHER_TABLE WHERE COLUMN_NAME IN (DIFFERENT_NAME AUS MY_TABLE WÄHLEN) *** Die Spalte DIFFERENT_NAME ist in OTHER_TABLE nicht vorhanden. Fehler bei ORA-00904. Ungültiger Bezeichner.

1. Wie kommt es, dass die Abfrage, die eine Spalte verwendet, die in der externen Abfrage vorhanden ist, aber in der internen Abfrage nicht vorhanden ist, nicht fehlschlägt?
2. Wie kommt es, die vollständige Tabelle zurückgibt?select * from Tabelle, in der Spalte in (Sub-Abfrage), in der Sub-Abfrage Rückkehr ORA-00904

Antwort

0

Sie können Spalten aus der "äußeren" Tabelle in der Abfrage in der in Klausel verwenden. Für jede Zeile aus der äußeren Tabelle wird der Wert der Zeile column_name aus der inneren Tabelle ausgewählt (ähnlich wie bei der Auswahl eines literalen Werts). Da es column_name Wert der Zeile aus der äußeren Abfrage ist, sind sie offensichtlich gleich, so dass die Bedingung erfüllt ist und die Zeile zurückgegeben wird.

Eine gute defensive Praxis, solche Fehler zu vermeiden, ist vollständig um die Spalten zu qualifizieren Sie (vorzugsweise unter Verwendung von Tabellen-Aliases) sind Abfragen, so dass die Abfrage statt Fehler würden Sie nicht erwarten, etwas von der Rückkehr aus:

SELECT * 
FROM other_table ot 
WHERE ot.column_name IN (SELECT mt.column_name -- causes error! 
          FROM my_table mt) 
0

Stellen Sie sich vor, dass wir zwei Tabellen: TA mit Feld A und TB mit Feld B, jetzt lassen Sie uns einige Anfragen schreiben:

select A -- wrong: TB doesn't have A field 
    from TB 

Aber diese wird OK sein und das Rück die gesamte TB Tabelle vorausgesetzt B Feld nicht null ist und TA ist nicht leer:

select * 
    from TB 
    where B in (select B -- <- B is from TB in both cases 
       from TA) 

In diesem Fall Sie

where B in (select B from TA) 

gleich sein müssen

-- 1. null in (...) is null, not true 
    -- 2. we have not empty TA 
    where (B is not null) and Exists (select 1 from TA) 

Und schließlich

select * 
    from TB 
    where B in (select C -- wrong: there's no field C in TB as well as in TA 
       from TA) 
Verwandte Themen