我一直在与此作斗争。这是来自测试网站的测试问题,但我没有人发送电子邮件并尝试从中找到答案。
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是否与之匹配?
答案 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的值。运气不好是一种罕见的情况,查找中存在空值: - )