2015-01-14 3 views
0

мой эми стол как этот столMySQL не существует в другой таблице

+------+------------+ 
| emp | emp_status | 
+------+------------+ 
| 001 | w   | 
| 002 | nw   | 
| 003 | w   | 
| 004 | w   | 
+------+------------+ 

и заработной платы является

+------+------------+ 
| emp | month  | 
+------+------------+ 
| 001 | Dec2013 | 
| 002 | Dec2013 | 
| 003 | Dec2013 | 
| 004 | Dec2013 | 
| 001 | Jan2014 | 
| 002 | Jan2014 | 
| 003 | Jan2014 | 
| 004 | Jan2014 | 
| 001 | Feb2014 | 
| 004 | Feb2014 | 
+------+------------+ 

так в течение месяца Feb2014 я хочу, чтобы получить эми, которые не были выплачены

+------+------------+ 
| emp | emp_status | 
+------+------------+ 
| 003 | w   | 
+------+------------+ 

я попытался с

SELECT * FROM emp WHERE NOT EXISTS (SELECT emp FROM salary where month_sal ='Feb2014') 

и я хочу использовать emp_status (с «W») Aswell ... любой намек ..

+0

Посмотрите на MySQL 'JOIN'. Это позволит вам запрашивать несколько таблиц из одного оператора SQL-запроса. – Kinnectus

+0

Странно, что месяц сохраняется как строка. Использовать тип данных DATE' лучше. – Raptor

+0

@raptor изменится ... thanx –

ответ

1

У вас не хватает для подключения пункт where в EXISTS для внешнего запроса, как это:

SELECT * FROM emp 
WHERE NOT EXISTS 
(
    SELECT NULL 
    FROM salary 
    where salary.month_sal ='Feb2014' 
    AND salary.emp=emp.emp 
) 
AND emp.emp_status='w' 

Что вы начали писать, выглядит как IN. Вы также можете сделать это так:

SELECT * FROM emp 
WHERE NOT emp.emp IN 
(
    SELECT salary.emp 
    FROM salary 
    where salary.month_sal ='Feb2014' 
) 
AND emp.emp_status='w' 
+0

gr8 workx !!!!! –

+0

NOT IN немного опасно, потому что если один зарплата.emp имеет значение NULL, никакие строки вообще не будут возвращены. Чтобы всегда использовать NOT EXISTS, это мой совет. – jarlh

+0

@jarlh : Я согласен. Я просто показываю OP diffrent возможность писать запрос – Arion

0

Следующая должно работать:

SELECT * 
FROM emp 
WHERE emp_status = 'w' 
    AND emp NOT IN (SELECT emp FROM emp WHERE month_sal ='Feb2014') 

Это выглядит немного странным, имеющий имя поля совпадает с именем таблицы, но мы надеемся, что это правильно.

Смежные вопросы