Неверный идентификатор при использовании естественного соединения - PullRequest
0 голосов
/ 05 марта 2019

Я получаю

ORA-00904: "E". "MANAGER_ID": неверный идентификатор 00904. 00000 - "% s: неверный идентификатор" * Причина:
* Действие: ошибкаen la línea: 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;

Я не знаюесли это имеет значение, но база данных - это встроенная база данных hr из oracle

EDIT: еще одна возможность, к которой я пришел, кроме ответов, заключается в следующем

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;

единственная проблема заключается вто есть не показывает сотрудников без назначенного менеджера.

1 Ответ

1 голос
/ 05 марта 2019

Не используйте естественное соединение! Я описываю это как «мерзость», потому что он использует столбцы, которые просто имеют одинаковые имена , а не должным образом объявленные отношения внешнего ключа. База данных отношений действительно должна выполнять «естественные» объединения на объявленных отношениях, а не на сопоставлении строк.

Это также затрудняет расшифровку и сопровождение запросов, поскольку ключи соединения не являются явными в запросе. Добавление столбца может сломать существующие запросы, и его будет довольно сложно отладить.

Вы также можете упростить логику объединения строк.

Я думаю, что запрос, который вы хотите, выглядит примерно так:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...