Неверный идентификатор Oracle (с внутренним соединением) - PullRequest
0 голосов
/ 15 мая 2018

У меня "Неверный идентификатор" в Oracle из-за "B.username" (столбец имени пользователя существует в таблице USER). Когда я удаляю это, все работает нормально. Как решить эту проблему? Я пришел из фона MySQL.

SELECT * FROM (SELECT qNA.assignment, qNA.regDate, B.username, (
    SELECT DISTINCT NVL(idx, 0) 
    FROM EK_USERGRADE
    WHERE year = (SELECT DISTINCT userGradeNo FROM EK_USER WHERE ID = qNA.userIdx)
) AS userGradeIdx
FROM EK_NEWTESTAPPLICANT qNA
WHERE IDX = :idx ) A 
INNER JOIN EK_USER  B ON (A.userIdx = B.ID)

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Это ORA-00903?

Пользователь - зарезервированное слово. Вы уверены, что создали эту таблицу? Имя таблицы не может быть зарезервированным словом.

0 голосов
/ 15 мая 2018

Давайте попробуем это с упрощенной версией вашего запроса:

-- test tables
create table NEWTESTAPPLICANT as select 1 useridx from dual  ;
create table B as select 1 id, 'name1' username from dual ;

-- query
select *
from (
  select B.username
  from NEWTESTAPPLICANT qNA
) A join B on A.useridx = B.id ;
-- ORA-00904: "B"."USERNAME": invalid identifier

В таблице NEWTESTAPPLICANT нет столбца «username», который вызывает ошибку.Боковой вид в строке (примеры см. здесь ) может помочь ...

-- query
select 
  *
from B, lateral (
  select B.username
  from NEWTESTAPPLICANT qNA
) A ;

-- result
ID  USERNAME  USERNAME  
1   name1     name1  

Это работает с Oracle 12c.

0 голосов
/ 15 мая 2018

Проблема в том, что и ваша виртуальная таблица A, и пользователи B имеют одинаковое имя столбца «username». Укажите псевдоним в главном выделении, например «Выбрать A. *, B. * from (...».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...