"IN"命令的AND逻辑运算符对应?

use*_*415 6 sql

假设我有两张桌子:

  • 雇员
  • EmpLocXref

如果我想列出属于位置1,2 3的员工,我会编写类似于以下内容的查询:

SELECT DISTINCT e.id, e.name
FROM Employee e
JOIN EmpLocXref x ON x.employee_id = e.id
WHERE x.location_id IN (1, 2, 3)
;
Run Code Online (Sandbox Code Playgroud)

例子.

但是,如果我想列出仅属于1,2 3 位置的员工呢?我意识到我可以写类似的东西:

SELECT e.id, e.name
FROM Employee e
JOIN EmpLocXref x ON x.employee_id = e.id
WHERE x.location_id IN (1, 2, 3)
GROUP BY e.id, e.name
HAVING COUNT(*) = 3
;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点,不包括动态SQL?

编辑:修复了第二次查询的derp时刻.添加了Fiddler示例.

小智 3

上面的代码实际上行不通,因为 EmpLocXref 中永远不会有一条记录,其中 location_id 同时为 1、2 和 3。你会得到零结果。试试这个:

SELECT DISTINCT e.*
FROM Employee e
INNER JOIN EmpLocXref x1 ON e.ID = x1.EmployeeID AND x1.Location_id = 1
INNER JOIN EmpLocXref x2 ON e.ID = x2.EmployeeID AND x2.Location_id = 2
INNER JOIN EmpLocXref x3 ON e.ID = x3.EmployeeID AND x3.Location_id = 3
Run Code Online (Sandbox Code Playgroud)