如何使用子查询Oracle SQL从3个表中检索数据

时间:2018-06-28 09:38:23

标签: oracle oracle-ebs

我想检索用户名,那里responsibility_key的end_date为null,我想使用nvl将其转换为(sysdate + 1),但是我只能检索到责任密钥而不是名字,请帮忙。

enter image description here

1 个答案:

答案 0 :(得分:2)

图像中的错误显示“列定义不明确”。仔细看看。您最后的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)
;

如果遵循这些要点,您将找到错误的根源。