【问题标题】:Invalid identifier when using natural join使用自然连接时标识符无效
【发布时间】:2019-03-05 11:51:10
【问题描述】:

我来了

ORA-00904: "E"."MANAGER_ID": 无效标识符 00904. 00000 - “%s:无效标识符” *原因:
*行动: 线性错误:323,列: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自带的hr数据库

编辑:除了答案之外,我达到的另一种可能性如下

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;

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

【问题讨论】:

  • 忘掉那个 NATURAL JOIN 结构吧。始终指定 JOIN 列!

标签: sql oracle


【解决方案1】:

不要使用自然连接!我将其描述为“可憎”,因为它使用的列仅具有相同的名称,而不是正确声明的外键关系。关系数据库实际上应该对声明的关系进行“自然”连接,而不是字符串匹配。

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

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

我认为你想要的查询看起来更像这样:

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。你的代码更干净
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2020-02-01
相关资源
最近更新 更多