powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00918 - где причина?
21 сообщений из 21, страница 1 из 1
ORA-00918 - где причина?
    #40032305
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой запрос:
Код: plsql
1.
2.
3.
4.
5.
with RS as ( ... )
select D.D, B.DATA as BALANCE, RS.MOMENT, RS.SRC, RS.DATA, RS.EXP, RS.EXTRA
from (select distinct trunc(MOMENT) D from RS) D
left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
join RS on (trunc(RS.MOMENT) = D.D and RS.SRC != 'balance')


Выдает ошибку ORA-00918.
Если последний джойн с RS закомментировать, то выполняется.
Не могу понять, где неоднозначность.

P.S. А если последний join заменить на left join, то выполняется.
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032339
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> ed
Wrote file afiedt.buf

  1  with RS as (select  'D' D, 'B. DATA' as BALANCE, '001' MOMENT, 'RS.' SRC, 'RS.' DATA, 'RS.' EXP, 'RS.'  EXTRA from dual
  2   )
  3  select D.D, B.DATA as BALANCE, RS.MOMENT, RS.SRC, RS.DATA, RS.EXP, RS.EXTRA
  4  from (select distinct trunc(MOMENT) D from RS) D
  5  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  6* join RS on (trunc(RS.MOMENT) = D.D and RS.SRC != 'balance')
SQL> /

         D BAL MOM SRC DAT EXP EXT
---------- --- --- --- --- --- ---
         1     001 RS. RS. RS. RS.



ps
11-версия

......
stax
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032348
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Задайте алиасы во всех обращениях к RS
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032350
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Альясы я пробовал задавать, как для столбцов, так и для таблиц. Не помогло.
Oracle 10g, ошибка ORA-00918 возникает как при запуске запроса в IDE, так и в SQL*Plus.
А вот с left join выполняется нормально.
Какой-то баг в 10g? Или особенности синтаксиса, которые я не учел?
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032354
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Какой-то баг в 10g?
Баг - это само использование 10g.
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032355
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Приведите листинг в sqlplus с ошибкой при явно указанных алиасах для всех обращений к rs

з.ы. ну и попробовать no_query_transformation если этот хинт есть в 10g
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032380
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Выдает ошибку ORA-00918.
какой текст у этой ошибки?
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032385
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus,

Думаю, и в 10g это тоже column ambiguously defined без указания на конкретику.
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032396
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
SQL*Plus,

Думаю, и в 10g это тоже column ambiguously defined без указания на конкретику.

Почему бы автору не написать текст этого сообщения?
Он считает, что мы все сообщения должны помнить?
Или он считает, что "не обломятся, найдут текст ошибки в инете"?

Написал код сообщения, напиши и его текст!
Тебе нужна помощь (не нам!), так сделай, чтобы проще было тебе помогать.
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032428
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
SQL*Plus: Release 12.1.0.2.0 Production on Вт Дек 29 19:56:11 2020

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Присоединен к:
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production

SQL> with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from dual)
select D.D, B.DATA as BALANCE, RS.MOMENT, RS.SRC, RS.DATA, RS.EXP, RS.EXTRA
  2    3  from (select distinct trunc(MOMENT) D from RS) D
  4  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  5  join RS on (trunc(RS.MOMENT) = D.D and RS.SRC != 'balance')
  6  /
with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from dual)
*
ошибка в строке 1:
ORA-00918: столбец определен неоднозначно


Затрач.время: 00:00:00.04
SQL> with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from dual)
select D.D, B.DATA as BALANCE, RS.MOMENT, RS.SRC, RS.DATA, RS.EXP, RS.EXTRA
  2    3  from (select distinct trunc(MOMENT) D from RS) D
  4  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  5  left join RS on (trunc(RS.MOMENT) = D.D and RS.SRC != 'balance')
  6  /

D                      BALANCE MOMENT              SRC        DATA E E
------------------- ---------- ------------------- ---- ---------- - -
2020-12-29 00:00:00            2020-12-29 19:56:29 test        123

Затрач.время: 00:00:00.00
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032438
Vlad074
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Листинг запроса с алиасом для RS в последнем join.
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032441
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

DDL выложи своей RS
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032449
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 10G багов на ANSI joins немерено. Поменяй местами inner и outer:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
SQL> select version from v$instance
  2  /

VERSION
-----------------
10.2.0.5.0

SQL> with RS as (select  'D' D, 'B. DATA' as BALANCE, '001' MOMENT, 'RS.' SRC, 'RS.' DATA, 'RS.' EXP
, 'RS.'  EXTRA from dual)
  2  select D.D, B.DATA as BALANCE, RS.MOMENT, RS.SRC, RS.DATA, RS.EXP, RS.EXTRA
  3  from (select distinct trunc(MOMENT) D from RS) D
  4  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  5  join RS on (trunc(RS.MOMENT) = D.D and RS.SRC != 'balance')
  6  /
with RS as (select  'D' D, 'B. DATA' as BALANCE, '001' MOMENT, 'RS.' SRC, 'RS.' DATA, 'RS.' EXP, 'RS.'
*
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL> with RS as (select  'D' D, 'B. DATA' as BALANCE, '001' MOMENT, 'RS.' SRC, 'RS.' DATA, 'RS.' EXP
, 'RS.'  EXTRA from dual)
  2  select D.D, B.DATA as BALANCE, RS.MOMENT, RS.SRC, RS.DATA, RS.EXP, RS.EXTRA
  3  from (select distinct trunc(MOMENT) D from RS) D
  4  join RS on (trunc(RS.MOMENT) = D.D and RS.SRC != 'balance')
  5  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  6  /

         D BAL MOM SRC DAT EXP EXT
---------- --- --- --- --- --- ---
         1     001 RS. RS. RS. RS.

SQL> 



SY.
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032454
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad074
Листинг запроса с алиасом для RS в последнем join.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from dual)
select D.D, B.DATA as BALANCE, RS.MOMENT c1, RS.SRC c2, RS.DATA c3, RS.EXP c4, RS.EXTRA c5
  2    3  from (select distinct trunc(MOMENT) D from RS) D
  4  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  5  join RS on (trunc(RS.MOMENT) = D.D and RS.SRC != 'balance')
  6  /
with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from dual)
*
ошибка в строке 1:
ORA-00918: столбец определен неоднозначно

AlexFF__|
DDL выложи своей RS

DDL нет, это несколько запросов, объединенных union all, используемых в with.

SY
В 10G багов на ANSI joins немерено. Поменяй местами inner и outer:

Понятно.
Спасибо за пример, значит это баг.
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032468
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Vlad074
Листинг запроса с алиасом для RS в последнем join.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from dual)
select D.D, B.DATA as BALANCE, RS.MOMENT c1, RS.SRC c2, RS.DATA c3, RS.EXP c4, RS.EXTRA c5
  2    3  from (select distinct trunc(MOMENT) D from RS) D
  4  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  5  join RS on (trunc(RS.MOMENT) = D.D and RS.SRC != 'balance')
  6  /
with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from dual)
*
ошибка в строке 1:
ORA-00918: столбец определен неоднозначно



AlexFF__|
DDL выложи своей RS

DDL нет, это несколько запросов, объединенных union all, используемых в with.

SY
В 10G багов на ANSI joins немерено. Поменяй местами inner и outer:

Понятно.
Спасибо за пример, значит это баг.

Для оформления кода используйте, пожалуйста, тэг SRC .
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032501
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой-то поддельный кривой листинг
Alibek B.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from dual)
select D.D, B.DATA as BALANCE, RS.MOMENT, RS.SRC, RS.DATA, RS.EXP, RS.EXTRA
  2    3   from (select distinct trunc(MOMENT) D from RS) D
  4  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  5  join RS on (trunc(RS.MOMENT) = D.D and RS.SRC != 'balance')
  6  /
with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from dual)
*

...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032549
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С алиасами внимательнее. А сложности с ANSI (FULL JOIN) еще в 11-м встречал. WITH в 10-ке тоже немного отличается от 11-го.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Присоединен к:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> with RS as (select sysdate MOMENT, 'test' SRC, 123 DATA, null EXP, null EXTRA from dual),
  2       D as (select 'V' V, 123 DATA from dual)
  3  select D.V, D.DATA, RS.MOMENT, RS.SRC, RS.DATA, RS.EXP, RS.EXTRA
  4  from D, RS;

V       DATA MOMENT   SRC        DATA E E
- ---------- -------- ---- ---------- - -
V        123 30.12.20 test        123

SQL> with RS as (select sysdate MOMENT, 'test' SRC, 123 DATA, null EXP, null EXTRA from dual)
  2  select D.D, B.DATA as BALANCE, RS.MOMENT, RS.SRC, RS.DATA, RS.EXP, RS.EXTRA
  3   from (select distinct trunc(MOMENT) D from RS) D;
select D.D, B.DATA as BALANCE, RS.MOMENT, RS.SRC, RS.DATA, RS.EXP, RS.EXTRA
                                                                   *
ошибка в строке 2:
ORA-00904: "RS"."EXTRA": недопустимый идентификатор


SQL> with RS as (select sysdate MOMENT, 'test' SRC, 123 DATA, null EXP, null EXTRA from dual),
  2      D as (select distinct trunc(MOMENT) D from RS)
  3  select D.D, B.DATA as BALANCE
  4   from D left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance');

D           BALANCE
-------- ----------
30.12.20

SQL> with RS as (select sysdate MOMENT, 'test' SRC, 123 DATA, null EXP, null EXTRA from dual),
  2      D as (select distinct trunc(MOMENT) D from RS)
  3  select D.D, B.DATA as BALANCE, B.MOMENT, B.SRC, B.DATA, B.EXP, B.EXTRA
  4   from D left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'test');

D           BALANCE MOMENT   SRC        DATA E E
-------- ---------- -------- ---- ---------- - -
30.12.20        123 30.12.20 test        123

...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032556
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdm
сложности с ANSI (FULL JOIN)
с 2003-его года, 16 лет работал исключительно в традиционном синтаксисе. на ANSI писали только FULL JOIN

но с 2016 начала параллельно работать с МССКЛ.
ANSI кажется более удобным и понятным, чем эти ваши плюсики )))
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032574
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx

...
ANSI кажется более удобным и понятным, чем эти ваши плюсики )))


AFAIK кроме того, что понятнее, так еще и некоторые запросы, которые можно легко изобразить в ANSI синтаксисе, с помощью (+) вообще не реализовываются.
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032936
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Код: plaintext
1.
  4  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  5  join RS on (trunc(RS.MOMENT) = D.D and RS.SRC != 'balance')

Ты дважды соединяешь RS, почему ленишься указать алиас для второго случая? Тут оракл и задумывается.
...
Рейтинг: 0 / 0
ORA-00918 - где причина?
    #40032957
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный Вася

Ты дважды соединяешь RS, почему ленишься указать алиас для второго случая? Тут оракл и задумывается.


Измышлизм. RS.MOMENT однозначно разрешается на RS без алиаса а B.MOMENT на RS с алиасом B. И добавление алиаса ничего не дает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
SQL> select version from v$instance
  2  /

VERSION
-----------------
10.2.0.5.0

SQL> with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from dual)
  2  select D.D, B.DATA as BALANCE, C.MOMENT, C.SRC, C.DATA, C.EXP, C.EXTRA
  3  from (select distinct trunc(MOMENT) D from RS) D
  4  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  5  join RS C on (trunc(C.MOMENT) = D.D and C.SRC != 'balance')
  6  /
with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA from du
*
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL> --  меняем местами inner и outer
SQL> with RS as (select sysdate as MOMENT, 'test' as SRC, 123 as DATA, null as EXP, null as EXTRA fr
om dual)
  2  select D.D, B.DATA as BALANCE, C.MOMENT, C.SRC, C.DATA, C.EXP, C.EXTRA
  3  from (select distinct trunc(MOMENT) D from RS) D
  4  join RS C on (trunc(C.MOMENT) = D.D and C.SRC != 'balance')
  5  left join RS B on (trunc(B.MOMENT) = D.D and B.SRC = 'balance')
  6  /

D            BALANCE MOMENT    SRC        DATA E E
--------- ---------- --------- ---- ---------- - -
01-JAN-21            01-JAN-21 test        123

SQL> 



SY.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00918 - где причина?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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