2014-11-04 2 views
-1

Я использую следующий запрос:однорядные подзапрос вопрос

select P.job_ref, P.emp_num, P.name, 
     P.job_title , P.job_type, 
     P.dept_ref, P.dept, J.mgr_rept, 
(select P.name as manager_name 
from PEOPLE P, JOB J 
where J.mgr_rept=P.job_ref) 
from PEOPLE P, JOB J 
where P.job_ref=J.job_ref 

Проблема заключается имена менеджера и сотрудника находятся в одной и той же таблицы под именем. job_ref ​​коррелирует с mgr_rept в таблице заданий. Сотрудники job_ref ​​равнялись бы значению в таблице заданий, которое вытягивало бы информацию о работе. Имя менеджера, однако, лежит в таблице людей. Значением mgr_rept будет номер job_ref ​​менеджеров. Использование этого запроса возвращает более одной строки, поэтому я ищу какую-то помощь, пожалуйста.

Спасибо

+0

Это смущает. job_ref ​​является основным ключом работы таблицы, правильно? Это не такой тип работы, как «покупатель», а определенная позиция, такая как «покупатель 05 в отделе A02». У менеджера также есть работа (например, «менеджер отдела A02»). Таким образом, запись для покупателя 05 содержит mgr_ref для записи, содержащей менеджера. У каждого человека есть работа, поэтому people.job_ref ​​также не является нулевым и уникальным. Существует отношение 1: 1 между людьми. Job_ref ​​и job.job_ref; у вас есть только две таблицы для разделения позиций работы от текущего владельца задания. Это правильно? Если нет, сообщите нам основные ключи и отношения. –

ответ

1

Прежде всего, вы больше не должны использовать старые разделенных запятыми присоединиться синтаксис. Он был заменен в стандартном SQL с явным соединением более 20 лет назад.

Ваш подзапрос выбирает все людей. Он никак не связан с записью в основном запросе. Возможно, вы смутили себя, снова используя одинаковые псевдонимы таблицы. Это должно быть примерно так:

select 
    P.job_ref, P.emp_num, P.name, 
    P.job_title , P.job_type, 
    P.dept_ref, P.dept, J.mgr_rept, 
    (
    select mgr.name 
    from PEOPLE mgr 
    where mgr.job_ref = J.mgr_rept 
) as manager_name 
from PEOPLE P 
join JOB J on P.job_ref = J.job_ref; 

Я не уверен на 100%, потому что я не понимаю вашу структуру таблицы полностью. Это работает только в том случае, если job_ref ​​уникален для людей таблицы.

Смежные вопросы