如何将“IN”用于多个列

时间:2011-03-18 19:16:08

标签: sql-server-2005

这个问题可能是微不足道的,甚至是愚蠢的,但我想知道是否有一种方法可以在一对一匹配的多列上使用“IN”。 例如,我使用

select emp_id from employee where emp_id IN (select emp_id from employee_other)

我怎样才能实现像

这样的东西
select emp_id from employee where emp_id,emp_org IN (select emp_id,emp_org from employee_other)

我知道我不能使用以下内容,因为它只是简单地进行联合,而我希望基于一对一记录匹配进行选择。

select emp_id from employee where emp_id IN (select emp_id from employee_other) and emp_org in (select emp_org from employee)

请注意,我不愿意使用EXCEPT。

谢谢你们

5 个答案:

答案 0 :(得分:5)

您可能想要使用EXISTS运算符

select e.emp_id 
from employee e
where EXISTS
    (
    SELECT *
    FROM employee_other eo
    WHERE e.emp_id = eo.emp_id
        AND e.emp_org = eo.emp_org
    )

答案 1 :(得分:3)

Microsoft SQL Server中的

IN仅适用于单个列,即。你只能写X IN (...),而不能写X,Y IN (...)

根据您的数据,有两种方法可以解决此问题:

  • 加入子查询
  • 使用EXISTS

要加入,请执行以下操作:

select emp_id
from employee
    inner join (select emp_id,emp_org from employee) as x
    on employee.emp_id = x.emp_id and employee.emp_org = x.emp_org

然而,你的例子有点糟糕,因为你使用的是同一张表。

要使用EXISTS,请执行以下操作:

select emp_id
from employee
where exists (
    select emp_id,emp_org from employee e2
    where e2.emp_id = employee.emp_id and e2.emp_org = employee.emp_org)

这与连接一样,将主表链接到“子查询”表,但如果“子查询”产生多个匹配,则连接将产生重复行,EXISTS子句不会

答案 2 :(得分:-1)

使用内部联接

select e1.emp_id from employee  e1
inner join employee_other e2 on e1.emp_id = e1.emp_id and e1.emp_org = e2.emp_org

如果employee_other表导致重复,您可能必须使用Distinct。

select Distinct e1.emp_id from employee  e1
inner join employee_other e2 on e1.emp_id = e1.emp_id and e1.emp_org = e2.emp_org

答案 3 :(得分:-1)

我不明白你想要实现的目标emp_org in (select emp_org from employee)并不总是如此?

这有用吗?

select emp_id from employee e
where exists (select 1 from employee_other eo  
              WHERE e.emp_id =eo.emp_id and 
              AND e.emp_org = eo.emp_org ) 

答案 4 :(得分:-1)

你在第二个例子中几乎完全正确。您只需在列名称周围添加parens。

select emp_id 
from employee 
where (emp_id,emp_org) IN (select emp_id,emp_org from employee)