Я хочу получить имя пользователя, а там responsibility_key
, где end_date имеет значение null, и я хочу преобразовать его в (sysdate+1) с помощью nvl, но я могу получить только ключ ответственности, а не имя, пожалуйста, помогите.
Как получить данные из 3 таблиц с помощью подзапроса оракула SQL
Ответы (1)
Ошибка на изображении гласит: «столбец определен неоднозначно». Посмотрите внимательно. Ваш последний END_DATE
может ссылаться либо на псевдоним u
, либо на таблицу из подзапроса. Измените его, чтобы он соответствовал остальной части вашего подзапроса (FIND_USER_GROUPS_DIRECT.END_DATE
)
ИЗМЕНИТЬ
Ваш запрос
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)
;
Если вы будете следовать этим пунктам, вы доберетесь до корня ошибки.