Как получить данные из 3 таблиц с помощью подзапроса оракула SQL

Я хочу получить имя пользователя, а там responsibility_key, где end_date имеет значение null, и я хочу преобразовать его в (sysdate+1) с помощью nvl, но я могу получить только ключ ответственности, а не имя, пожалуйста, помогите.

введите здесь описание изображения


person mekdi    schedule 28.06.2018    source источник
comment
Пожалуйста, разместите свой sql в вопросе, а не в виде изображения   -  person geco17    schedule 28.06.2018


Ответы (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)
;
  1. Запрос не отформатирован, что затрудняет его чтение.
  2. Не все столбцы уточняются именем таблицы (или псевдонимами), как указано в комментариях.
  3. В настоящее время запрос использует неявное соединение.
  4. Запрос невозможно понять, не видя определений таблиц (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)
;

Если вы будете следовать этим пунктам, вы доберетесь до корня ошибки.

person geco17    schedule 28.06.2018
comment
@mekdi, вы должны всегда уточнять все столбцы с именами таблиц (или, что еще лучше, псевдонимами таблиц), которым они принадлежат. Просмотрите свой код и исправьте это. Без него ваш код а) недействителен (очевидно, Oracle сказал вам об этом), б) его будет сложно отлаживать через неделю или две, так как вы забудете, какая таблица содержит какие столбцы), не говоря уже о ком-то еще, кто д должен сделать это. - person Littlefoot; 29.06.2018