Как получить данные из 3 таблиц, используя подзапрос Oracle Oracle - PullRequest
0 голосов
/ 28 июня 2018

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

enter image description here

1 Ответ

0 голосов
/ 28 июня 2018

Ошибка в изображении говорит "столбец определен неоднозначно". Присмотритесь. Ваш последний 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)
;
  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)
;

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

...