0

我想检索用户名以及responsibility_keyend_date 为空的地方,我想使用 nvl 将其转换为 (sysdate+1) 但我只能检索response_key 而不是名称,请帮忙。

在此处输入图像描述

4

1 回答 1

2

The error in the image says "column ambiguously defined". Take a close look. Your last END_DATE could refer to either the u alias or the table from the subquery. Change it to match the rest of your subquery (FIND_USER_GROUPS_DIRECT.END_DATE)

EDIT

Your query is

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. The query isn't formatted, which makes it hard to read.
  2. Not all columns are qualified with table name (or aliases), as mentioned in the comments.
  3. The query currently uses an implicit join.
  4. The query is impossible to understand without seeing the table definitions (desc [table_name]).

For points 1 and 2, a properly formatted query will look something like

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)
;

This makes it easier to read and in addition to this, you can see that without table definitions I guessed (see point 4) as to which tables the end_date column belongs in your query. If I had to guess, so does Oracle. That means you have an ambiguity problem. To fix it, take a close look at the end_date column as it appears in your original query and where you do not prefix it with anything, you need to prefix it with the appropriate alias (after you have aliased all your tables).

For point 3, you can write your query more clearly with an explicit join and by using aliases for all columns. As for the explicit join I have no idea what your tables look like but one possibility is something like

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)
;

If you follow these points you will get to the root of the error.

于 2018-06-28T09:45:36.837 回答