2010-06-29 120 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