Alias

對於查詢,您可以使用兩個詞的別名嗎

  • June 7, 2017

我想做的是

SELECT COUNT(CustomerID) as CC as 'Customer Count', Country
FROM Customers
GROUP BY Country
HAVING CC > 5
ORDER BY CC DESC;

這是錯誤的。

什麼是正確的方法?

來自:W3schools.com

更新:我的原始答案如下。我完全錯過了原始答案中的兩個“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

在上面,唯一的排序方式是col2fromt1而不是顯示名稱的列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...

(這有明顯的問題)

引用自:https://dba.stackexchange.com/questions/175600