2015-06-21 30 views
0

我試圖得到的結果爲Microsoft SQL Server上的類似查詢列名的FROM子句:SQL服務器:具有與在那裏與選擇「爲」

SELECT 
    A, B, C AS DANUMBER 
FROM 
    TABLE 
WHERE 
    B = 'SOMEVALUE' 
HAVING 
    DANUMBER > 0 

但是,我不能使用的專欄中,我在SQL Server中選擇了「AS」。服務器根本不知道DANUMBER

我擡頭看的每個例子都會通知有關顯示聚合函數的信息,但沒有解決我的問題。此查詢適用於mySQL,但不適用於SQL Server。

我想我可能會丟失一些語法或東西...

回答

0

MySQL的擴展使用HAVING條款的認識在SELECT定義的列別名。您不能在其他數據庫中假設這種行爲(它在SQL Server和Oracle中不起作用,例如,它在Postgres中起作用)。您有三種選擇:重複表達式,使用子查詢或使用CTE。

第一,可能都SQL Server和MySQL在運行的最佳代碼:

SELECT A, B, C AS DANUMBER 
FROM TABLE 
WHERE B = 'SOMEVALUE' 
GROUP BY A, B, C 
HAVING C > 0; 

或:

SELECT A, B, C AS DANUMBER 
FROM TABLE 
WHERE B = 'SOMEVALUE' AND 
     C > 0; 
+0

漂亮確保它不會在Postgres的工作。這個語法在任何實現窗口函數的DBMS中都不能正常工作,因爲別名可以引用「having」後面計算的表達式。 –

+0

我的天啊。我不想再重複這個表達方式,認爲它會重做這個操作,因爲它是一個有一些負載的paranthesis。但根據你的解釋,似乎沒有選擇: -/ – cenk

+0

意思是說,在where子句和連接完成後,任何結果都會被過濾以查看它們是否通過having子句設置的條件。經常用於計數或總計查詢,您只希望查看大於某種條件的結果。在你提供的例子中使用沒有意義。你想要一個帶有和子句的地方。 –