SQLite子查询尝试查找id是否在另一列中不存在

时间:2018-01-16 12:30:24

标签: sql sqlite

我一直在与此作斗争。这是来自测试网站的测试问题,但我没有人发送电子邮件并尝试从中找到答案。

CREATE TABLE employees (
  id INTEGER NOT NULL PRIMARY KEY,
  managerId INTEGER REFERENCES employees(id), 
  name VARCHAR(30) NOT NULL
);

INSERT INTO employees(id, managerId, name) VALUES(1, NULL, 'John');
INSERT INTO employees(id, managerId, name) VALUES(2, 1, 'Mike');

-- Expected output (in any order):
-- name
-- ----
-- Mike

-- Explanation:
-- In this example.
-- John is Mike's manager. Mike does not manage anyone.
-- Mike is the only employee who does not manage anyone.
     

编写一个查询,选择不是经理的员工姓名。

这是我提出的,但它不起作用。

SELECT name
FROM employees
WHERE id NOT IN(SELECT managerId FROM employees)

我只想了解如何遍历managerId列并检查Id是否与之匹配?

1 个答案:

答案 0 :(得分:1)

这是因为其中一个选定的经理ID为空。 Null是“未知价值”。所以NOT IN没有成功,因为它不能保证你的值不在数据集中(因为你的值可能是未知值)。那么,到目前为止这个论点。

所以:

SELECT name
FROM employees
WHERE id NOT IN (SELECT managerId FROM employees WHERE managerId IS NOT NULL);

SELECT name
FROM employees e
WHERE NOT EXISTS (SELECT * FROM employees m WHERE m.managerId = e.id);

这真是一个必须要注意的令人讨厌的陷阱。通常我们查找不能为null的值。运气不好是一种罕见的情况,查找中存在空值: - )