Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00918 - где причина? / 21 сообщений из 21, страница 1 из 1
29.12.2020, 15:25
    #40032305
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
Есть такой запрос:
Код: 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
29.12.2020, 16:08
    #40032339
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
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
29.12.2020, 16:21
    #40032348
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
Alibek B.,

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

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

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

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

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

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

Написал код сообщения, напиши и его текст!
Тебе нужна помощь (не нам!), так сделай, чтобы проще было тебе помогать.
...
Рейтинг: 0 / 0
29.12.2020, 19:57
    #40032428
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
Код: 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
29.12.2020, 20:49
    #40032438
Vlad074
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
Листинг запроса с алиасом для RS в последнем join.
...
Рейтинг: 0 / 0
29.12.2020, 20:56
    #40032441
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
Alibek B.,

DDL выложи своей RS
...
Рейтинг: 0 / 0
29.12.2020, 21:42
    #40032449
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
В 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
29.12.2020, 22:00
    #40032454
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
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
29.12.2020, 23:17
    #40032468
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
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
30.12.2020, 09:26
    #40032501
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
какой-то поддельный кривой листинг
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
30.12.2020, 11:32
    #40032549
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
С алиасами внимательнее. А сложности с 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
30.12.2020, 11:54
    #40032556
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
dmdmdm
сложности с ANSI (FULL JOIN)
с 2003-его года, 16 лет работал исключительно в традиционном синтаксисе. на ANSI писали только FULL JOIN

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

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


AFAIK кроме того, что понятнее, так еще и некоторые запросы, которые можно легко изобразить в ANSI синтаксисе, с помощью (+) вообще не реализовываются.
...
Рейтинг: 0 / 0
01.01.2021, 04:04
    #40032936
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
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
01.01.2021, 15:03
    #40032957
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00918 - где причина?
Правильный Вася

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


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