2014-11-01 62 views
0

我在SQL非常新,我使用sqlzoo實踐,並在其AdventureWorks #14我用下面的代碼和它沒有工作當在SQL必須指定源表中的變量在MySQL

SELECT COUNT(SalesOrderID), SUM(SubTotal),RANGE FROM 
(SELECT SalesOrderID,SubTotal, 
     CASE WHEN SubTotal<99 
     THEN '0-99' 
     WHEN SubTotal <999 
     THEN '100-999' 
     WHEN SubTotal < 9999 
     THEN '1000-9999' 
     ELSE '10000-' 
     END AS 'RANGE' 
FROM SalesOrderHeader) as new 
GROUP BY RANGE 

然而,當我改變了代碼

SELECT COUNT(SalesOrderID), SUM(SubTotal),new.RANGE FROM 
(SELECT SalesOrderID,SubTotal, 
     CASE WHEN SubTotal<99 
     THEN '0-99' 
     WHEN SubTotal <999 
     THEN '100-999' 
     WHEN SubTotal < 9999 
     THEN '1000-9999' 
     ELSE '10000-' 
     END AS 'RANGE' 
FROM SalesOrderHeader) as new 
GROUP BY new.RANGE 

它的工作通過聲明的RANGE源表我只是不知道什麼時候我必須聲明變量的來源,因爲RANGE是在衍生表獨特之處?那是因爲它是一個派生表還是因爲它是一個標量?

另一個問題是我們何時必須給派生表一個新的名字?

+0

只是一個小小提示。如果你正在學習SQL,最好像PostgreSQL一樣使用類似於SQL標準的數據庫。 MySQL提供了很大的自由度,但是因爲這會教你主要是MySQL而不是SQL。 – Wolph 2014-11-01 14:25:36

回答

1

RANGE是MySQL中的保留字。你可以看到列表here

因爲它是一個保留字,所以當您只使用RANGE時,會混淆解析器。如果你有new.RANGE,那麼解析器可以發現你的意思是一列。

這裏有一些規則來幫助你編寫更好的代碼:

  • 避免使用對錶和列名的保留字。
  • 使用限定列名稱(即使用表別名)是一種很好的做法。
  • 請勿爲列名使用單引號。如果你不得不逃避名字,在MySQL中使用反引號(以及其他數據庫中的相應轉義字符)。

我建議寫你的查詢爲:

SELECT COUNT(SalesOrderID), SUM(SubTotal), soh.TheRange 
FROM (SELECT SalesOrderID, SubTotal, 
      (CASE WHEN SubTotal < 99 THEN '0-99' 
        WHEN SubTotal < 999 THEN '100-999' 
        WHEN SubTotal < 9999 THEN '1000-9999' 
        ELSE '10000-' 
       END) AS TheRange 
     FROM SalesOrderHeader 
    ) soh 
GROUP BY soh.TheRange; 

或者,與子查詢分配:

SELECT COUNT(SalesOrderID), SUM(SubTotal), 
     (CASE WHEN SubTotal < 99 THEN '0-99' 
      WHEN SubTotal < 999 THEN '100-999' 
      WHEN SubTotal < 9999 THEN '1000-9999' 
      ELSE '10000-' 
     END) AS TheRange 
FROM SalesOrderHeader soh 
GROUP BY TheRange; 

您也可能會注意到,我總是用as列的別名而從不使用as表的別名。

+0

我有一個疑問如果假設@MYjx使用'rrr'作爲新列,那麼它不需要使用alias.rrr。請清除我的疑問? – 2014-11-01 14:16:07

+1

@HardikParmar。 。 。如果列可以明確地確定來自一個表或子查詢(並且您會注意到我沒有在最後一個示例中使用它們),則不需要使用表別名。我的意思是使用它們是一種很好的做法,我做出了這一改變。 – 2014-11-01 14:17:57

+0

謝謝你澄清我的疑惑.. @@@@@ – 2014-11-01 14:23:54

相關問題