2010-08-30 3 views
3
---------- 
User 
---------- 
user_ID(pk) 
UserEmail 

---------- 
Project_Account 
---------- 
actno 
actname 
projno 
projname 
ProjEmpID 
ProjEmpMGRID 

Где ProjEmpID, ProjEmpMGRID - user_id, а ProjEmpMGRID может быть нулевым. Мне нужно найти номер пользователя и отобразить таблицу project_account. Мне нужно запросить с actNo, у которого есть повторяющиеся значения.Left Outer Присоединиться к подзапросам?

Мой запрос выглядит следующим образом:

select projno,projname,actno,actname, 
(select u.user_email as project_manager from project_account c left outer join users u 
    on u.user_id = c.ProjEmpID where actno='some no')as project_manager, 

    (select u.user_email as program_manager from project_account c left outer join users u 
     on u.user_id = c.ProjEmpMGRID where actno='someno') as program_manager 

     from project_account where actno='someno' 

Сообщение об ошибке я получаю в Oracle:

ORA-01427 одиночные возвращается строка подзапрос более одной строки

Как мой подзапрос возвращает более одного идентификатора электронной почты, я получаю эту ошибку. Как я уже сказал, действие «нет» не уникально. Я мог понять ошибку, но я не мог понять решение. Я делаю левое внешнее соединение в подзапросе, потому что в идентификаторе prog manager могут быть нули.

Любая помощь будет оценена по достоинству.

ответ

5

Ошибка, которую вы получаете, заключается в том, что один из ваших подзапросов (для project_manager или program_manager) возвращает вам несколько идентификаторов, основанных на ваших условиях. Такой подход имеет смысл, поскольку несколько учетных записей проектов могут иметь один и тот же «actno», так как вы не указали, что в качестве ключа Primarky (pk)

Вместо того, чтобы использовать подзапросы, просто присоединитесь непосредственно к пользовательским таблицам найти идентификаторы

select projno,projname,actno,actname, 
    project_user.user_email as project_manager, 
    program_user.user_email as program_manager 
    from project_account 
    left join User as project_user 
     on project_account.ProjEmpID = project_user.user_id 
    left join User as program_user 
     on project_account.ProjEmpMGRID = program_user.user_id 

where actno='someno' 
+0

+1: Избили меня к нему –

+0

thanks.it работает. – jero

2

а что-то вроде:

select c.projno, c.projname, c.actno, c.actname, u.user_email as project_manager, us.user_email as program_manager 

from project_account c 

left outer join users u 
on u.user_id = c.ProjEmpID 

left outer join users us 
on us.user_id = c.ProjEmpMGRID 

WHERE actno = 'someno' 

Таким образом, вы не используете подзапросы и возвращение нескольких результатов и пытается сохранить их как одно значение.

0

Почему бы вам просто не использовать это?

select projno, projname, actno, actname, (select user_email from users where user_id = pa.projempid), (select user_email from users where user_id = pa.projempmgrid) from project_account pa

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