子查询实现

Subquery implementation

我有一个tableemployees

------------------------------------------------
| name  | email              | date_employment |
|-------+--------------------|-----------------|
| MAX   | qwerty@gmail.com   | 2021-08-18      |
| ALEX  | qwerty2@gmail.com  | 1998-07-10      |
| ROBERT| qwerty3@gmail.com  | 2016-08-23      |
| JOHN  | qwerty4@gmail.com  | 2001-03-09      |
------------------------------------------------

并且我想编写一个子查询来显示在他们身边工作超过 10 年的员工。

SELECT employees.name, employees.email, employees.date_employment
FROM employees
WHERE 10 > (SELECT round((julianday('now') - julianday(employees.date_employment)) / 365, 0) FROM employees);

执行此请求后,将显示所有员工,无论其资历如何。 如果你这样写一个请求,那么一切正常

SELECT name, round((julianday('now') - julianday(employees.date_employment)) / 365, 0) as ex
FROM employees WHERE ex > 10;

为什么子查询不能正常工作?

如果执行子查询:

SELECT round((julianday('now') - julianday(employees.date_employment)) / 365, 0) AS ex
FROM employees

你会看到它 returns 4 行:

ex
1
24
6
21

WHERE 子句的条件下使用上述结果集与 10 进行比较是没有意义的。
但是 SQLite 允许它,而其他数据库会抛出错误。

SQLite 如何处理这种情况? 它仅选择结果集的 1 个值(通常是 first)并在 WHERE 子句中使用它,因此您的代码相当于:

WHERE 10 > 1

始终是 true,这就是为什么您得到 table 的所有行的原因。