Ошибка в изображении говорит "столбец определен неоднозначно". Присмотритесь. Ваш последний END_DATE
может ссылаться либо на псевдоним u
, либо на таблицу из подзапроса. Измените его, чтобы он соответствовал остальной части вашего подзапроса (FIND_USER_GROUPS_DIRECT.END_DATE
)
EDIT
Ваш запрос
select u.USER_NAME, d.responsibility_key from FND_USER u,FND_RESPONSIBILITY_VL d
where responsibility_id in(
select responsibility_id from
FND_USER_RESP_GROUPS_DIRECT WHERE END_USER_RESP_GROUPS_DIRECT.END_DATE=nvl(END_DATE,sysdate+1)) and
u.END_DATE=nvl(END_DATE,SYSDATE + 1)
;
- Запрос не отформатирован, что затрудняет его чтение.
- Не во всех столбцах указывается имя таблицы (или псевдонимы), как указано в комментариях.
- В настоящее время в запросе используется неявное соединение.
- Запрос невозможно понять, не увидев определения таблиц (
desc [table_name]
).
Для пунктов 1 и 2 правильно отформатированный запрос будет выглядеть примерно так:
select u.user_name, d.responsibility_key
from
fnd_user u,
fnd_responsibility_vl d
where
d.responsibility_id in (
select urgd.responsibility_id
from
fnd_user_resp_groups_direct urgd
where
urgd.end_date = nvl(u.end_date, sysdate+1)
) and
u.end_date = nvl(urgd.end_date, sysdate + 1)
;
Это облегчает чтение, и в дополнение к этому вы можете видеть, что без определения таблиц я угадал (см. Пункт 4) относительно того, к каким таблицам относится столбец end_date
в вашем запросе. Если бы я должен был угадать, Oracle тоже. Это означает, что у вас есть проблема неоднозначности. Чтобы исправить это, внимательно посмотрите на столбец end_date
в том виде, в каком он отображается в исходном запросе, и там, где вы не ставите перед ним префикс, вам нужно добавить префикс с соответствующим псевдонимом (после того, как вы добавили псевдонимы ко всем таблицам).
Для пункта 3 вы можете написать запрос более четко с помощью явного объединения и использования псевдонимов для всех столбцов. Что касается явного объединения, я понятия не имею, как выглядят ваши таблицы, но одна возможность - что-то вроде
select u.user_name, d.responsibility_key
from fnd_user u
join fnd_responsibility_vl d
on u.id = d.user_id
where
d.responsibility_id in (
select responsibility_id
from fnd_user_resp_groups_direct urgd
where
urgd.end_date = nvl(u.end_date, sysdate+1)
) and
u.end_date = nvl(urgd.end_date, sysdate+1)
;
Если вы будете следовать этим пунктам, вы получите корень ошибки.