2010-06-29 3 views
2
---------- 
User 
---------- 
user_ID(pk) 
UserEmail 

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

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

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

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

Работодатель Нет относится к значениям из таблицы проекта. 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 clause.Is там какой-нибудь другой способ я мог бы переписать запрос, чтобы получить результат. любая помощь будет оценена по достоинству.

+0

Приведите пример, я не понимаю, что вы хотите чтобы сделать и переименовать столбец, он не читается. –

ответ

5

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

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

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

+0

спасибо, но есть ли способы оптимизации запроса. – jero

+4

Вы не можете оптимизировать то, что не работает с сыном ... –

2

Eric Hauser правильный - вы не можете указать два столбца в SELECT, содержащиеся в предложении IN, на один столбец вне.

То есть, я переписал запрос, так что вам не нужно использовать Союзов на всех:

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 ПРИСОЕДИНЯЙСЯ синтаксис - исходные использования ANSI- 89.

+0

Исходные соединения совместимы с ANSI-92. См. Раздел 7.5 «Объединенная таблица», синтаксическое правило № 1. – onedaywhen

1

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

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

Пример # 1

+2

Почему? ............ –

+0

Я не знаком с точными причинами, но это как-то связано с использованием IN и вспомогательный запрос, он выполняет полное сканирование таблицы. При использовании EXISTS он получает shortcutted и возвращает true при первом знаке, что утверждение истинно, я думаю, использование EXISTS также позволяет использовать индексы. Я нашел эту статью, которая объясняет разницу довольно хорошо, я верю. http://articles.techrepublic.com.com/5100-10878_11-5297080.html –

0
emp.Emp2NO IN 
(select ProjEmpID from project) or (select ProjEmpMGRID from project) 

Надеется, что вы будете understant, почему это должно быть так. u можете отправить мне письмо по адресу [email protected]

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

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