Глюк оракла? Где ошибка ORA-00918?

Sergey Molchanov
Дата: 14.11.2008 13:38:22
Нашел такой неприятный момент в оракле.

Связываю три таблицы в запросе, причем у первой и третьей таблицы есть колонка с одинаковым названием. Запрос иерархический, в CONNECT BY упоминается имя поля, которое есть в двух таблицах, но не указано уточнение имени таблицы или алиаса. По идее оракл должен выругаться:
ORA-00918: столбец определен неоднозначно
Но он не ругается, а молча берет поле из последней таблицы, которая участвует в связке.
Причем если связано не три таблицы, а две (если среднюю таблицу исключить), то ошибка есть, как и должно быть.

Почему оракл молчит и не выдает ошибку ORA-00918? Это действительно глюк или я чего-то недопонимаю?

Контрольный пример
create table tab_a (id number(2) primary key, parentid number(2) references tab_a(id));
create table tab_b (id number(2) primary key);
create table tab_c (id_a number(2), id_b number(2));
insert into tab_a (id, parentid) values (1, null);
insert into tab_a (id, parentid) values (2, 1);

select *
from tab_a
left join tab_c
on tab_a.id = tab_c.id_a
left join tab_b
on tab_c.id_b = tab_b.id
connect by parentid = prior id -- какой id? из tab_a или tab_b? почему-то берет из tab_b, не ругаясь
start with parentid is null;
SQL*Plus
Дата: 14.11.2008 13:44:45
Ума не приложу как же вам удалось из такого "контрольного примера" понять, что
... -- ... почему-то берет из tab_b, не ругаясь
:-)
pravednik
Дата: 14.11.2008 13:48:49
SQL*Plus
Ума не приложу как же вам удалось из такого "контрольного примера" понять, что
... -- ... почему-то берет из tab_b, не ругаясь
:-)


видать кое-что упущено ;)
SQL> select *
  2  from tab_a
  3  left join tab_c
  4  on tab_a.id = tab_c.id_a
  5  left join tab_b
  6  on tab_c.id_b = tab_b.id
  7  connect by parentid = prior id -- какой id? из tab_a или tab_b? почему-то берет из tab_b, не ругаясь
  8  start with parentid is null;

        ID   PARENTID       ID_A       ID_B         ID
---------- ---------- ---------- ---------- ----------
         1

SQL> ed
Wrote file afiedt.buf

  1  select *
  2  from tab_a
  3  left join tab_c
  4  on tab_a.id = tab_c.id_a
  5  left join tab_b
  6  on tab_c.id_b = tab_b.id
  7  connect by parentid = prior tab_a.id -- какой id? из tab_a или tab_b? почему-то берет из tab_b, не ругаясь
  8* start with parentid is null
SQL> /

        ID   PARENTID       ID_A       ID_B         ID
---------- ---------- ---------- ---------- ----------
         1
         2          1

SQL> ed
Wrote file afiedt.buf

  1  select *
  2  from tab_a
  3  left join tab_c
  4  on tab_a.id = tab_c.id_a
  5  left join tab_b
  6  on tab_c.id_b = tab_b.id
  7  connect by parentid = prior tab_b.id -- какой id? из tab_a или tab_b? почему-то берет из tab_b, не ругаясь
  8* start with parentid is null
SQL> /

        ID   PARENTID       ID_A       ID_B         ID
---------- ---------- ---------- ---------- ----------
         1

SQL>
Sergey Molchanov
Дата: 18.11.2008 09:47:23
На Оракле сказали, что это известный баг, который был исправлен патчем. Нужно обновляться.
Вопрос снимается, всем спасибо.