powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-01799: a column may not be outer-joined to a subquery
3 сообщений из 3, страница 1 из 1
ORA-01799: a column may not be outer-joined to a subquery
    #40100428
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся с этой ошибкой впервые...
Имеем:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> with left_table as (
  2          select 3 n from dual),
  3       table1 as (
  4          select rownum a from dual connect by level < 5),
  5       table2 as (
  6          select rownum + 2 b from dual connect by level < 5)
  7  select *
  8    from table1 t1
  9    left join table2 t2 on t1.a = t2.b and t2.b = (select n from left_table)
 10  ;
with left_table as (
*
ERROR at line 1:
ORA-01799: a column may not be outer-joined to a subquery

SQL>

Если погуглить, то консенсус интернета сводится к "так же писать нельзя", однако Том "наше всё" Кайт парирует, что если очень хочется, то можно , а запрет касается только синтаксиса с (+). Но тут я не понял, он тестирует это всё на 19.10, а у меня в наличии только 19.0 и 12.1.0.2. Начиная с какой версии всё-таки можно?

А самое интересное, что все эти "запреты" обходятся элементарно с помощью тупого заворачивания запроса в select * from (...):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> with left_table as (
  2          select 3 n from dual),
  3       table1 as (
  4          select rownum a from dual connect by level < 5),
  5       table2 as (
  6          select rownum + 2 b from dual connect by level < 5)
  7  select *
  8    from (select *
  9            from table1 t1
 10            left join table2 t2 on t1.a = t2.b and t2.b = (select n from left_table))
 11  ;

         A          B
---------- ----------
         3          3
         1
         2
         4

SQL>

Что-то я запутался, что из этого баг, а что фича?
...
Рейтинг: 0 / 0
ORA-01799: a column may not be outer-joined to a subquery
    #40100446
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никанор Кузьмич,

C 12-й версии Оракл переписывает запросы с внешним соединением по скаляру.
Конкретно в приведенном случае кляуза with препятствовала переписыванию, что я бы считал багом.
Того же эффекта можно добиться через no_query_transformation.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> select *
  2    from table1 t1
  3    left join table2 t2 on t1.a = t2.b and t2.b = (select n from left_table);

         A          B
---------- ----------
         3          3
         1
         2
         4

SQL>
SQL> select --+ no_query_transformation
  2         *
  3    from table1 t1
  4    left join table2 t2 on t1.a = t2.b and t2.b = (select n from left_table);
select --+ no_query_transformation
*
ERROR at line 1:
ORA-01799: a column may not be outer-joined to a subquery

Все подробности по переписыванию в 10053.
...
Рейтинг: 0 / 0
ORA-01799: a column may not be outer-joined to a subquery
    #40100452
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, вроде немного прояснилось.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-01799: a column may not be outer-joined to a subquery
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]