从SQL中的另一个表返回相应的变量?

时间:2018-09-06 15:39:06

标签: sql

说我有两个表,Employees

first    last        ID    hire         terminated    wage
------   ---------   ---   ----------   -----------   ----
Ruth     Halburg     1     2010-05-15   2017-03-01    2000
Sally    Hallson     2     2010-08-20   NULL          5000
Merry    Hallway     3     2011-01-24   NULL          3000

RoutineReviews

ID      EmployeeID   RevDate
-----   ----------   -------------
10      1            2015-02-02
11      2            2014-11-28
12      1            2014-09-03

第一张表中的IDEmployeeID相对应;我该如何编写查询以返回所有从未进行过审核的员工(例如,员工3),按其雇用日期排序?

SELECT first last Employee.ID hire terminated wage
FROM Employees, RoutineReviews
WHERE Employees.ID != RoutineReviews.EmployeeID;

由于某种原因,这似乎不起作用。

3 个答案:

答案 0 :(得分:2)

我们可以在此处使用EXISTS子句:

SELECT *
FROM Employees e
WHERE NOT EXISTS (SELECT 1 FROM RoutineReviews r WHERE e.ID = r.EmployeeID)
ORDER BY hire;

enter image description here

Demo

答案 1 :(得分:0)

左联接在这里很方便:

SELECT e.first, e.last, e.ID, e.hire, e.terminated, e.wage
FROM Employees e
LEFT JOIN RoutineReviews r
on e.ID = r.EmployeeID
WHERE r.EmployeeID IS NULL

答案 2 :(得分:0)

您也可以在此处使用LEFT JOIN

SELECT 
 Employees.*
FROM 
 Employees
LEFT JOIN 
 RoutineReviews
ON 
 Employees.ID = RoutineReviews.EmployeeID   
WHERE
 RoutineReviews.ID IS NULL

或者使用NOT IN,我建议您不要使用它,因为MySQL往往会严重优化与协同相关的子查询。
查询在这里供参考。

SELECT 
 Employees.*
FROM 
 Employees
WHERE
 Employees.ID NOT IN (
  SELECT 
   RoutineReviews.EmployeeID   
  FROM 
   RoutineReviews
  WHERE
   RoutineReviews.EmployeeID = Employees.ID
)