我已经为此战斗了一段时间。这是来自测试站点的测试问题,但是我没有人可以发电子邮件并尝试从中找到答案。
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是否与之匹配?
最佳答案
这是因为所选的管理员ID之一为空。空值是“未知值”。因此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的值。不幸的是,在查询中存在null的罕见情况:-)
关于sql - SQLite子查询尝试查找另一列中是否不存在ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48281347/