Left Outer Присоединиться к подзапросам? - PullRequest
3 голосов
/ 30 августа 2010
----------
User
----------
user_ID(pk)
UserEmail

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

Где ProjEmpID, ProjEmpMGRID - это идентификатор_пользователя, а ProjEmpMGRID может быть нулевым.Мне нужно посмотреть useremail и отобразить таблицу project_account.Мне нужно сделать запрос с actNo, который имеет повторяющиеся значения.

Мой запрос выглядит так:

 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 подзапрос одной строки возвращает более одной строки

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

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

5 голосов
/ 30 августа 2010

Ошибка, которую вы получаете, состоит в том, что один из ваших подзапросов (для 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'
2 голосов
/ 30 августа 2010

Что-то вроде:

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 голосов
/ 12 августа 2013

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

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

...