子查询实现
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 的所有行的原因。
我有一个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 的所有行的原因。