Ich verstehe das Verhalten in diesem Fall nicht. Nach meinem Verständnis sollte eine Abfrage mit einer ungültigen Unterabfrage zu einem Fehler führen. Aber in diesem Beispiel gibt es einige Zeilen zurück.Abfrage mit gebrochenen Sub-Select sollte zu einem Fehler führen, aber Zeilen
-Test-Daten:
create table test_values (tst_id number, tst_id2 number, tst_value varchar2(10));
create table test_lookup (tst_id number, tst_value varchar2(10));
insert into test_values(tst_id, tst_id2, tst_value) values (1, 2, 'a');
insert into test_values(tst_id, tst_id2, tst_value) values (1, 2, 'b');
insert into test_values(tst_id, tst_id2, tst_value) values (2, 2,'c');
insert into test_values(tst_id, tst_id2, tst_value) values (2, 2,'d');
insert into test_lookup(tst_id, tst_value) values (1, 'findMe');
commit;
Arbeiten wie erwartet:
select * from test_values where tst_id in (select tst_id from test_lookup where tst_value = 'findMe');
/*
TST_ID TST_ID2 TST_VALUE
---------- ---------- ----------
1 2 b
1 2 a
*/
select tst_id2 from test_lookup where tst_value = 'findMe';
--ORA-00904: "TST_ID2": invalid identifier
Aber die folgende Abfrage wird auch Zeilen abrufen, offensichtlich durch den "Test_ID2" -Spalte aus dem "test_values" nehmen - Tabelle und nicht von der "test_lookup" -Tabelle wie in der Unterabfrage angegeben und obwohl NOT-Aliase für innere und äußere Teile nicht verwendet werden.
select * from test_values where tst_id in (select tst_id2 from test_lookup where tst_value = 'findMe');
/*
TST_ID TST_ID2 TST_VALUE
---------- ---------- ----------
2 2 c
2 2 d
*/
@vmachan das OP einen vollständigen Testfall, einschließlich Erstellen von Tabellen und Einfügen von Anweisungen. Ich bin nicht sicher, welche zusätzlichen Informationen Sie erwarten, dass das OP zu ihrer Frage hinzufügt! – Boneist
Ich fragte eine ähnliche Frage hier http://stackoverflow.com/questions/34774242/force-outer-select-to-fail-if-the-inner-select-contains-an-invalid-identifier. Wenn Sie fragen, wie Sie dieses Verhalten ändern können ... scheint das nicht möglich zu sein. –
Ja. Es benutzt den richtigen (aber längeren) Code und alles ist gut Ding;) – evilive