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

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

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

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

我需要顯示用戶電子郵件ID。表格之間的關係如下所示: 在Employer(1 & 2)表中,EmpID包含User表中的UserID的值。使用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

舉例,我不明白你想要什麼要做,並重命名您的專欄,這是不可讀的。 – 2010-06-30 07:47:06

回答

5

您只能從子查詢中返回一列。如果你只是想兩個僱員ID和經理ID考慮聯合查詢作爲子查詢:

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

或重寫使用兩個在每個單獨的子查詢的查詢。

+0

謝謝,但有什麼方法來優化查詢。 – jero 2010-06-29 22:06:23

+4

你不能優化什麼不工作的兒子... – 2010-06-29 23:42:27

2

Eric Hauser是正確的 - 您不能在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。

+0

原來的連接符合ANSI-92標準。請參閱第7.5節'已連接表',語法規則編號1. – onedaywhen 2010-06-30 09:44:59

1

我會建議不要使用IN語句。改用EXISTS。

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

例子#1

+2

爲什麼?............ – 2010-06-30 08:10:12

+0

我並不熟悉確切的原因,但它與使用時有關IN和一個子查詢引擎執行全表掃描。當使用EXISTS時,它會得到快捷方式,並在第一個符號聲明爲真時返回true,我想用EXISTS也可以使用索引。我找到了這篇文章,我相信這很好地解釋了這種差異。 http://articles.techrepublic.com.com/5100-10878_11-5297080.html – 2010-06-30 17:20:33

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

希望你會understant爲什麼它應該是這樣。你可以發郵件給我[email protected]

好吧,我會expalin。 Emp1NO是一個值,在值列表中的每個值處被一個列值返回,其中,當你的查詢返回一個很多矩陣(行數)X 2