對於查詢,您可以使用兩個詞的別名嗎
我想做的是
SELECT COUNT(CustomerID) as CC as 'Customer Count', Country FROM Customers GROUP BY Country HAVING CC > 5 ORDER BY CC DESC;
這是錯誤的。
什麼是正確的方法?
更新:我的原始答案如下。我完全錯過了原始答案中的兩個“AS”子句,並且回答好像
AS 'Customer Count'
不存在。我不知道有任何 SQL 語言可以讓您在給定查詢中為列名指定多個別名。
而且,在我知道的每個 SQL 變體中,列名“別名”僅用作顯示名稱。實際查詢中唯一可以引用別名而不是使用原始表中定義的列名(或者,對於通過表達式創建的列,實際表達式)的部分位於
ORDER BY
子句中。我的理解是,這僅僅是因為,一旦ORDER BY
應用,基本查詢將返回哪些行的實際確定就完成了;TOP
或者LIMIT
可以確定將看到哪些行,但哪些行符合基本標準是已知的,它們的內容也是如此。正如 Robert Carnegie 所指出的,唯一能讓您在功能上使用顯示名稱作為查詢其餘部分(、、
WHERE
子句或定義另一列的表達式)中的列的解決方法是構造一個子查詢,在其中為列設置別名有問題,以便在主查詢中您可以使用該別名。GROUP BY``HAVING
為避免
COUNT(CustomerId)
在您的HAVING
子句(和'Customer Count'
您的ORDER BY
子句)中使用,您必須重組查詢:SELECT CC as 'Customer Count', Country FROM (SELECT COUNT(CustomerID) as CC, Country FROM Customers GROUP BY Country ) sq WHERE CC > 5 ORDER BY CC DESC;
鑑於需要子查詢,我不清楚這是否比提供相同結果的更基本的查詢形式更容易理解:
SELECT COUNT(CustomerID) as 'Customer Count', Country FROM Customers GROUP BY Country HAVING COUNT(CustomerID) > 5 ORDER BY 'Customer Count' DESC;
原始答案:
不確定您使用的是什麼版本的 SQL,但我懷疑這在其中相當普遍。
在查詢的上下文中,列的顯示名稱被忽略。您必須通過基礎欄位的名稱或完整計算來引用它。
據我所知,只有該
ORDER BY
子句符合查詢上下文之外的條件;在那裡,引擎假定您正在使用顯示名稱,除非您另有說明 範例:SELECT t1.col1 as col1 ,t2.col1 as col2 ,t1.col27 as col3 FROM t1 INNER JOIN t2 ON t1.col1 = t2.col16 ORDER BY col1, t1.col2
在上面,唯一的排序方式是
col2
fromt1
而不是顯示名稱的列col2
(最初t2.col1
)是指定t1
.所以,而不是:
HAVING CC > 5
你需要使用:
HAVING COUNT(CustomerID) > 5
覆蓋列名的幾種方法 - 我遠離 SQL,但這可能有效;但是,我發現像這樣的子查詢可能表現不佳。
SELECT sq.cc AS [Customer Count], sq.Country FROM ( SELECT COUNT(CustomerID) AS cc, Country GROUP BY Country HAVING COUNT(CustomerID) > 5 ) sq ORDER BY sq.cc DESC
或者,
SELECT 0 AS [Customer Count], 'Canadia' AS Country WHERE ( 'Rows' = 'None' ) UNION ALL SELECT ...separate query with its own column naming...
(這有明顯的問題)