еще один косяк в Oracle

Jaffar
Дата: 21.10.2015 14:29:10
добрый день.

Сегодня столкнулся с очередным "тихим" косяком в Oracle.

поясню на примере:
есть запрос состоящий из вьюх

например
select
Column1, column2, column3
from View1 v1
join View2 v2 on ...
join View3 v3 on ...
where
        Column1 = 2


при этом поле Column1 присутствует в нескольких вьюхах -и по идее оракл должен был бы как все нормальные СУБД - возмутиться такому запросу, что мол непонятно что ты имеешь в виду - но нет он молчаливо проглатывает это и в условии where подставляет какой-то Column1 из х/з какой- вьюхи и запрос срабатывает и возвращает результат.
Тоже самое со столбцом в select - возвращает, хотя должен был бы сругаться.

Вот что это такое за свинство?

Будьте осторожны не наступите в ЭТО.

Конечно можно тут вопить что нужно писать правильно с псевдонимами (что я и делаю) - но СУБД то должна проверять или нет?

больше всего в mssql я люблю cross apply.
SY
Дата: 21.10.2015 14:35:51
SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for 64-bit Windows: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

SQL> select deptno from emp,dept;
select deptno from emp,dept
       *
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL> create or replace view emp_vw as select * from emp;

View created.

SQL> create or replace view dept_vw as select * from dept;

View created.

SQL> select deptno from emp_vw,dept_vw;
select deptno from emp_vw,dept_vw
       *
ERROR at line 1:
ORA-00918: column ambiguously defined

SQL> select deptno from emp_vw join dept_vw on 1 = 1;
select deptno from emp_vw join dept_vw on 1 = 1
       *
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL>  


SY.
Sayan Malakshinov
Дата: 21.10.2015 14:37:09
Jaffar,

Версия оракла какая? Какая нибудь x.x.0.1? Тест кейс есть?
Sayan Malakshinov
Дата: 21.10.2015 14:39:06
Jaffar,

И вообще, надо указывать в предикатах столбец точно....
Elic
Дата: 21.10.2015 14:42:49
Jaffar
Дата: 21.10.2015 14:59:46
Версия
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production


1.Таблица не джойнится сама на себя - это разные вьюхи, которые внутри ведут к разным таблицам.

2.Понятно что надо "псевдонимить" - я так всегда и делаю - просто тут не успел ибо запос был разовый и вот Oracle спалился.

3.Тестовые данные - позже - можете сами попробовать взять 2 табличу и сделать к ним 2 вьюхи ипроверить.
Забыл пароль
Дата: 22.10.2015 11:16:37
Jaffar,

по п.3 -- вариант SY разве не это же демонстрирует?

Честно -- сомневаюсь, что даже 10.2.0.4 такое проглотит.
Посмотрим, есть ли у меня где этот пожилой бодрячок для тестирования
ivan78
Дата: 22.10.2015 13:15:53
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Solaris: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

SQL> select deptno from emp,dept;
select deptno from emp,dept
       *
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL> create or replace view emp_vw as select * from emp;

View created.

SQL> create or replace view dept_vw as select * from dept;

View created.

SQL> select deptno from emp_vw,dept_vw;
select deptno from emp_vw,dept_vw
       *
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL> select deptno from emp_vw join dept_vw on 1 = 1;
select deptno from emp_vw join dept_vw on 1 = 1
       *
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL>
Victor Metelitsa
Дата: 22.10.2015 17:51:48
Могу подтвердить, что в своё время я тоже нарывался на странности с двусмысленностями (очевидные двусмысленности не детектились, в отличие от DB2), ругался и с тех пор взял за правило всегда префиксовать все колонки. И ввиду этого правила мне сейчас будет чрезвычайно сложно что-то такое воспроизвести.
MonteCarlos
Дата: 22.10.2015 22:52:05
На 9-м оракле с такой фигней сталкивался. При переходе на 11-й из-за этого заволилось несколько пакетов.
Да, надо префиксировать. Так и запрос читать удобней, если он не мал, сразу видно откуда поле.