Sql 使用自然联接时标识符无效

Sql 使用自然联接时标识符无效,sql,oracle,Sql,Oracle,我越来越 ORA-00904:E.MANAGER\u ID:无效标识符 90400000-%s:无效标识符 *原因: *行动: 莱尼亚错误:323,A列:77 使用以下代码。位置323列77指的是该代码中第5列第6列的位置 select concat (concat(concat('Id: ',e.employee_id), concat ('',e.first_name)),concat('. ',e.last_name)) as "Employee info", j

我越来越

ORA-00904:E.MANAGER\u ID:无效标识符 90400000-%s:无效标识符 *原因: *行动: 莱尼亚错误:323,A列:77

使用以下代码。位置323列77指的是该代码中第5列第6列的位置

    select concat (concat(concat('Id: ',e.employee_id),
    concat ('',e.first_name)),concat('. ',e.last_name)) as "Employee info", 
    job_title, salary, department_name, 
    (select first_name from employees 
    where e.manager_id=employee_id) as "Manager name"
    from employees e 
    natural join jobs natural join departments;
如果我单独执行查询,如下所示:

select e.first_name as "Worker name", nvl((select first_name from employees where e.manager_id=employee_id),'Sin manager') as "Manager name"
from employees e
order by e.employee_id;
我不知道这是否重要,但数据库是oracle内置的人力资源数据库

编辑:除了答案之外,我得出的另一个可能性是

select concat (concat(concat('Id: ',e.employee_id),
concat (' ',e.first_name)),
concat('. ',e.last_name)) as "Employee info", 
job_title, e.salary, department_name, m.first_name, m.employee_id
from employees e join jobs j
on (e.job_id = j.job_id)
join departments d
on (e.department_id = d.department_id)
join employees m
on (e.manager_id=m.employee_id)
order by e.employee_id;

唯一的问题是没有显示没有分配经理的员工。

不要使用自然加入!我将其描述为一种讨厌的行为,因为它使用的列只有相同的名称,而没有正确声明外键关系。关系数据库实际上应该对声明的关系进行自然连接,而不是字符串匹配

这也使得查询更难破译和维护,因为连接键在查询中不显式。添加列可能会破坏现有查询,并且很难调试

您还可以简化连接字符串的逻辑

我认为您想要的查询更像这样:

select ('Id: ' || e.employee_id  || e.first_name || '.', e.last_name) as Employee_info, 
       j.job_title, e.salary, d.department_name, 
       (select em.
        from employees em
        where e.manager_id = em.employee_id
      ) as Manager_name
from employees e join
     jobs j
     on e.job_id = j.job_id join
     departments d
     on e.department_id = d.department_id;

忘掉自然连接结构吧。始终指定联接列!正如你所说的那样,它提供了一些写作错误,但是这个想法是正确的。顺便说一句,我要开始用| |代替concat。你的代码更干净