Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 ORA-00904 при обращении к полю из подзапроса  [new]
Андрей0407
Member

Откуда:
Сообщений: 71
Доброе время суток!
Подскажите, пожалуйста, почему при обращении к полю основной таблицы из подзапроса выбрасывается
m.id ORA-00904: invalid column name
.
select m.id from main m 
where not exists (
  select 1 from expected_detail exd 
    left join (select d.code, d.id from detail d where d.main_id = m.id) di on exd.code = di.code 
    where di.id is not null)

DDL таблиц представлен ниже.
+

--
create table main (
  id numeric(15) constraint pk_main primary key,
  val varchar(64));
--
create table detail (
  id numeric(15),
   main_id numeric (15) constraint fk_main references main(id),
   code numeric(15));
--
create table expected_detail (
  code numeric(15),
  val varchar(64));
--


Запрос выполняется на Oracle 11g. Для Firebird 2.5 выполнение запроса не вызывает ошибок.
Заранее благодарен, извините, если баян - с ораклом не знаком.
31 дек 15, 00:32    [18630347]     Ответить | Цитировать Сообщить модератору
 Re: ORA-00904 при обращении к полю из подзапроса  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10053
Андрей0407,

Согласно SQL стандарту корреляция возможна только на один уровень. А тут на два. Если переписать сохраняя ANSI синтакс то все-равно ругается:

select m.id from main m 
where not exists (
  select 1 from expected_detail exd 
    left join detail di on exd.code = di.code and di.main_id = m.id
    where di.id is not null)


А с родным все пучком:

select m.id from main m 
where not exists (
  select 1 from expected_detail exd,
    detail di
     where di.main_id(+) = m.id and exd.code = di.code(+) 
    and di.id is not null)


SY.
31 дек 15, 01:00    [18630421]     Ответить | Цитировать Сообщить модератору
 Re: ORA-00904 при обращении к полю из подзапроса  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Андрей0407,

Ошибка возникает в 11.2.0.3, 11.2.0.4.
В 12.1.0.2 ошибки не возникает, о чем SY уже писал, когда вышла 12c.

+
SQL> --
SQL> create table main (
  2    id numeric(15) constraint pk_main primary key,
  3    val varchar(64));

Table created.

SQL> --
SQL> create table detail (
  2    id numeric(15),
  3     main_id numeric (15) constraint fk_main references main(id),
  4     code numeric(15));

Table created.

SQL> --
SQL> create table expected_detail (
  2    code numeric(15),
  3    val varchar(64));

Table created.

SQL>
SQL> select m.id from main m
  2  where not exists (
  3    select 1 from expected_detail exd
  4      left join (select d.code, d.id from detail d where d.main_id = m.id) di on exd.code = di.code
  5      where di.id is not null);

no rows selected


SQL> select banner from v$version;


BANNER
--------------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
CORE12.1.0.2.0Product   ion
TNS for Solaris: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production


Вот документ MOS, который документирует, что поведение 12c является корректным:
Query Fails With ORA-00904 In 11g But Works Fine In 12c (Doc ID 2067066.1)
31 дек 15, 06:12    [18630524]     Ответить | Цитировать Сообщить модератору
 Re: ORA-00904 при обращении к полю из подзапроса  [new]
Андрей0407
Member

Откуда:
Сообщений: 71
SY, SeaGate
Большое спасибо за ответы. Постараюсь переписать запросы с использованием WHERE JOINS.
Database SQL Language Reference.SELECT
Oracle strongly recommends that you use the more flexible FROM clause join syntax shown in the former example.
31 дек 15, 11:24    [18631238]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить