подзапрос с использованием предложения IN - PullRequest
2 голосов
/ 30 июня 2010
----------
User
----------
user_ID(pk)
UserEmail

----------
Employer1
----------
Emp1ID(pk)
Emp1NO

----------
Employer2
----------
Emp2ID(pk)
Emp2NO

----------
Project
----------
ProjEmpID
ProjEmpMGRID

Мне нужно отобразить идентификатор электронной почты пользователя. Соотношение между таблицами выглядит следующим образом: В таблице Employer (1 & 2) EmpID содержит значение UserID в таблице User.

Номер работодателя относится к значениям из таблицы Project. EmpNo содержит значения из ProjEmpID, ProjEmpMGRID.

 select u.user_email from users u, Employer emp 
    where emp.Emp1ID =  u.user_id and 
    emp.Emp1NO IN
    (select ProjEmpID,ProjEmpMGRID from project)
union 
  select u.user_email from users u, Employer emp 
    where emp.Emp2ID =  u.user_id and 
    emp.Emp2NO IN
    (select ProjEmpID,ProjEmpMGRID from project)

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

Ответы [ 4 ]

5 голосов
/ 30 июня 2010

Вы можете вернуть только один столбец из вашего подзапроса. Если вы просто хотите, чтобы и идентификатор сотрудника, и идентификатор менеджера рассматривали запрос объединения как ваш подзапрос:

    emp.Emp2NO IN
(select ProjEmpID from project
 union
 select ProjEmpMGRID from project)

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

2 голосов
/ 30 июня 2010

Эрик Хаузер прав: вы не можете указать два столбца в SELECT, содержащихся в предложении IN, для одного столбца снаружи.

Тем не менее, я переписал ваш запрос, так что вам вообще не нужно использовать UNION:

SELECT DISTINCT u.user_email
  FROM USERS u
  JOIN EMPLOYER e ON u.user_id IN (e.emp1id, e.emp2id) 
  JOIN PROJECT p ON e.emp1no IN (p.projempid, p.projempmgrid)
                 OR e.emp2no IN (p.projempid, p.projempmgrid)

Я также изменил запрос на использование синтаксиса ANSI-92 JOIN - ваш оригинал использует ANSI-89.

1 голос
/ 30 июня 2010

Я бы рекомендовал не использовать оператор IN. Вместо этого используйте EXISTS.

http://www.techonthenet.com/sql/exists.php

Пример # 1

0 голосов
/ 29 декабря 2012
emp.Emp2NO IN
 (select ProjEmpID from project) or (select ProjEmpMGRID from project)

Надеюсь, вы поймете, почему так должно быть. вы можете написать мне письмо на gnmsr@ap.nic.in

Хорошо, я объясню. Emp1NO - это одно значение, разбитое на каждое значение в списке значений, возвращаемых значениями из одного столбца, где по мере того как ваш запрос возвращает матрицу из множества (количество строк) X 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...