Как использовать «IN» для более чем одного столбца - PullRequest
3 голосов
/ 18 марта 2011

Этот вопрос может быть тривиальным или даже глупым, но мне было интересно, есть ли способ использовать «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)

Обратите внимание, что я не хочу использовать, КРОМЕ.

Спасибо, ребята

Ответы [ 5 ]

5 голосов
/ 18 марта 2011

Вы можете использовать оператор 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
    )
3 голосов
/ 18 марта 2011

IN в Microsoft SQL Server работает только с одним столбцом, т.е. Вы можете написать только 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 не .

0 голосов
/ 18 марта 2011

У вас почти все было правильно во втором примере.Вам просто нужно добавить символы скобки вокруг имен столбцов.

select emp_id 
from employee 
where (emp_id,emp_org) IN (select emp_id,emp_org from employee)
0 голосов
/ 18 марта 2011

Я не понимаю, что вы пытаетесь достичь с помощью 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 ) 
0 голосов
/ 18 марта 2011

Использовать Inner Join

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

Возможно, вам придется использовать Distinct, если таблица employee_other вызывает сбой.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...