2015-09-09 2 views
1

У меня есть две таблицы, которые могут быть соединены с помощью одного поля:Выбор строк, которые не существуют при объединении двух таблиц

Table_1: 

    emp_id emp_name department 
    ------ -------- ---------- 
    1  Adam  Accounting 
    2  Peter  Engineering 
    3  Bruce  Engineering 


Table_2: 

    emp_id emp_salary 
    ------ ---------- 
    1  1000 
    3  3500 
    5  2000 

Я хочу, чтобы выбрать строки в таблице 2, которые не появляются при вступлении в две таблицы (в этом примере emp_id = 5). Я пытался следующее заявление, но я получаю 0 строк:

select * from table_2 
where not exists 
(
select * from table_1, table_2 
where table_1.emp_id = table_2.emp_id); 
+0

Между двумя утверждениями нет никакой связи; ваше предложение EXISTS всегда будет возвращать что-то, пока есть один идентификатор, который находится в обеих таблицах ... другими словами, это всегда верно, и вам нужно связать 'table_2' с вашим предложением EXISTS. Это должно помочь вам увидеть, что вам нужен только список идентификаторов в 'table_2', которые не существуют в' table_1', что является более простым предложением. – Ben

+0

Вместо этого вы должны использовать внутреннее соединение. – Xravn

+0

Это внутреннее соединение @ sra1. – Ben

ответ

2

Так легко, просто удалить table_2 из подзапроса:

select * 
from table_2 
where not exists (select 1 
        from table_1 
        where table_1.emp_id = table_2.emp_id); 
+0

Удивительное и простое решение! Спасибо! –

2

Try:

select * from table_2 
where 
emp_id not in (select emp_id from table_1) 
+1

NOT IN - это немного опасно, если emp_id имеет значение NULL. Если это так, добавьте, где emp_id не является нулевым для подзапроса. – jarlh

0

выберите * из таблицы_2 где emp_id не в (выберите emp_id из таблицы_1)

Вы можете использовать этот запрос, если emp_id является основным в обеих таблицах.