SELECT
"employees"."FIRST_NAME",
"employees"."LAST_NAME",
"employees"."SALARY"
FROM
'employees'
WHERE
(("employees"."SALARY" > (SELECT "employees"."SALARY"
FROM 'employees'
WHERE (("employees"."FIRST_NAME" = "Alexander")))))`
子查詢回傳 2 個值。他們怎么能與之相比"employees"."salary"?也就是說,有 2 名員工的名字為“Alexander”...用 2 元素元組替換子查詢會給出 SQL 客戶端不接受的查詢...也就是說,這個查詢應該等同于上面的查詢,但是它無法正確執行:
SELECT
"employees"."FIRST_NAME", "employees"."LAST_NAME",
"employees"."SALARY"
FROM
'employees'
WHERE
(("employees"."SALARY" > (3500, 9000)))
到底是怎么回事?
uj5u.com熱心網友回復:
請注意,假設 SQLite 標記是正確的 ,即有多種 SQL 風格,因此使用的資料庫管理器很重要且相關。
子查詢回傳 2 個值。怎么能和“員工”、“薪水”相提并論?
您可以使用可以采用多個值的函式來比較多個值,例如max,這可能是您需要的。
例如
SELECT "employees"."FIRST_NAME", "employees"."LAST_NAME", "employees"."SALARY" FROM 'employees' WHERE (("employees"."SALARY" > max(3500, 9000)))
到底是怎么回事?
第一種是使用 WHERE 子句,它是一個有效的運算式,可以是真或假。第二個是濫用值,即在需要單個值的地方提供值串列。
uj5u.com熱心網友回復:
首先,寫你的查詢,你不應該“參考”每個部分,它會變得混亂和臃腫。此外,您可以使用別名來提高可讀性。你很快就會看到的。如果您使用引號,請在特定值周圍使用單引號,例如日期 > '2022-02-22'。
現在開始您的查詢。您的查詢正在尋找比給定人 (Alexander) 更高的薪水,但有多個同名的人。要獲得一個答案,您可能需要標準的 MAX() 薪水。所以這基本上變成了兩個查詢......一個依賴于另一個。
因此,為了給您答案,外部查詢是您將獲得的結果,WHERE 查詢是對您感興趣的一份薪水的預限定。
Select
e.first_name,
e.last_name,
e.salary
from
employees e
where
e.salary > ( select max( e2.salary )
from employees e2
where e2.first_name = 'Alexander' )
請注意,where 子句從員工表中獲取員工“Alexander”的任何 MAX() 工資值。所以現在,那個 ONE 值作為外部查詢的基礎回來了。
注意縮進,您可以更好地了解外部查詢是如何依賴它的。也使查詢更具可讀性。
uj5u.com熱心網友回復:
來自SQL 語言運算式/11。子查詢運算式:
括在括號中的 SELECT 陳述句是子查詢。所有型別的 SELECT 陳述句,包括聚合和復合 SELECT 查詢(使用 UNION 或 EXCEPT 等關鍵字的查詢)都允許作為標量子查詢。子查詢運算式的值是封閉的 SELECT 陳述句結果的第一行。如果封閉的 SELECT 陳述句不回傳任何行,則子查詢運算式的值為 NULL。
您的查詢不會在 SQLite 以外的任何其他資料庫中運行。但是,正如您從檔案中看到的那樣,SQLite 不會像子查詢回傳超過 1 行
那樣拋出錯誤,而是通過僅保留它回傳的第一行來允許子查詢。
這是 SQLite 的非標準 sql 功能之一,在您的情況下它會導致錯誤的結果。
我相信,您想要的是將每個員工的薪水與所有名為 的員工的最高薪水進行比較'Alexander'。
您可以通過將子查詢更改為:
SELECT MAX(SALARY) FROM employees WHERE FIRST_NAME = 'Alexander'
這是一個不相關的標量子查詢,因此不需要任何別名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434092.html
