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

标签 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是否与之匹配?

最佳答案

这是因为所选的管理员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/

相关文章:

php - SQL 查询在 Fiddle 中有效,但在实际的 PHP 代码中出错

sql - oracle中<number>d或<number>f是什么意思?

javascript - promise 解决未定义,但数据仍已过帐

java - 使用附加写入文本文件 - java

sql - 派生属性是否应该复制为列或每次都进行计算?

sql - 在 Access 2007 中删除多个表中的记录

objective-c - 无法从 SQLite 数据库检索值

python - 聚合日期列中断 PARSE_DECLTYPES

performance - SQLite:selectall_arrayref 速度问题

sql - Bash 脚本和 PostgreSQL : How to access column values returned from SELECT statement