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
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)
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)
- 1. Führt Subabfrage in Select für nur 5 Recs aus, wenn offset fetch next verwendet wird
- 2. SQL-Code: SELECT * FROM Tabelle WHERE Spalte
- 3. SQLite Einsatz in Tabelle select * from
- 4. Wie SELECT Spalte, * FROM TABLE in Oracle?
- 5. SQL select * from Spalte, in Jahr = 2010
- 6. SELECT * FROM Tabelle WHERE "substring" IN table_field?
- 7. SELECT * FROM in MySQLi
- 8. Wie Prozentsatz der Spalte in der Tabelle
- 9. Select * FROM Tabelle zwei und zählen (coulmn_name) FROM Tabelle ein
- 10. SELECT * FROM Tabelle Wo CURDATE()
- 11. die virtuelle Spalte mit Tabelle hinzufügen, während select * from
- 12. Bigquery SELECT * FROM Tabelle wobei Spalte = 'String' keine Werte zurückgibt
- 13. Einfügen in ... Werte (SELECT ... FROM ...) in postgresql?
- 14. SELECT * INTO [newdatabase]. [Tabelle] FROM [otherdatabase]. [Tabelle]
- 15. SELECT SUM() FROM (SELECT (SELECT())
- 16. Verwendung der Variablen in der from-Klausel in der Select-Anweisung
- 17. Select * From Tabelle als Tabelle dblink
- 18. die maximale Datum in der Innen Rückkehr Join-Tabelle
- 19. SQL-Select-rekursiv in der gleichen Tabelle
- 20. SELECT * FROM Tabelle WHERE x IN (... ein paar hundert Ints ...)
- 21. MySQL: Gespeicherte Prozedur in SELECT und FROM
- 22. SELECT * FROM Tabelle WHERE `id` in ... und wo sum() weniger
- 23. Node.js SELECT * FROM eine Tabelle in einer SQL-Datenbank
- 24. SELECT * FROM MULTIPLE TABLE in der Suche QUERY
- 25. SELECT 1 FROM Tabelle, seltsam print_r
- 26. Hibernate-Syntax, Schreiben der FROM als SELECT DISTINCT FROM?
- 27. Verbindungsabschnitt in der From-Klausel
- 28. Was ist der Unterschied zwischen select * from Tabelle und wählen Sie Namen, Handy aus der Tabelle
- 29. Mehrere select Abfragen in der gleichen Tabelle in Oracle
- 30. SQL in Java Select From Where