我有一張桌子employees
------------------------------------------------
| 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;
為什么子查詢不能正常作業?
uj5u.com熱心網友回復:
如果執行子查詢:
SELECT round((julianday('now') - julianday(employees.date_employment)) / 365, 0) AS ex
FROM employees
你會看到它回傳 4 行:
| 前任 |
|---|
| 1 |
| 24 |
| 6 |
| 21 |
WHERE在子句的條件中使用上述結果集與 10 進行比較是沒有意義的。
但是 SQLite 允許這樣做,而其他資料庫會拋出錯誤。
SQLite 如何處理這種情況?它只選擇結果集的一個值(通常是第一個)并在WHERE子句中使用它,因此您的代碼相當于:
WHERE 10 > 1
總是這樣true,這就是為什么你會得到表的所有行的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/480468.html
上一篇:EF核心更新條目然后插入
