2012-01-23 85 views
3

我正在使用存儲過程公用表表達式下面我出想顯示升序國名訂購公用表表達式問題

 
1 | India 
2 | Bangladesh 
3 | Srilanka 
4 | Nepal 
5 | Japan 

的表達式如下

WITH CTECountry as 
(
SELECT 
    CountryID, 
    CountryName 
FROM dbo.Country 
ORDER BY CountryName ASC   
) 
SELECT 
* 
FROM CTECountry 
UNION SELECT '0','--Select--' 
+2

您應該將訂單移至其他選擇。 –

+0

我想使用表達式本身的順序 –

+0

@MathewPaul:沒有意義 – gbn

回答

5

ORDER BY適用於整個UNION(在這種情況下需要ALL)。

在任何情況下,只有最外面的ORDER BY子句保證對結果進行排序。除了在某些情況下,內部和中間ORDER BY子句沒有任何作用或產生錯誤。

​​

編輯,我懷疑你上面

WITH CTECountry as 
(
SELECT 
    CountryID, 
    CountryName, 
    1 AS SortOrder 
FROM dbo.Country 
UNION ALL 
SELECT '0','--Select--', 2 
) 
SELECT 
    CountryID, 
    CountryName 
FROM 
    CTECountry 
ORDER BY 
    SortOrder, CountryName ASC 
+0

我不能在外面使用它需要把它放在表達式本身 –

+0

@MathewPaul:好的,你不能。看到我的第二個查詢。或者更新你的問題來解釋你真正想要的...... – gbn

+0

@gbn基於評論「我想展示 - 只選擇頂部」,我認爲你應該改變你的SortOrder值。 – hvd

1

類似GBN的答案,但稍微簡單一些評論後,希望這樣的:

WITH CTECountry as 
(
SELECT 
    CountryID, 
    CountryName 
FROM dbo.Country 
) 
SELECT 
* 
FROM CTECountry 
UNION SELECT 0,'--Select--' 
ORDER BY sign(CountryID) DESC, CountryName ASC 

(假設CountryID實際上是數字,而不是字符串)

0

通過修改查詢來解決問題

WITH CTECountry

如 ( SELECT ROW_NUMBER()OVER ( ORDER BY國家或地區名稱ASC )AS ROWNUMBER, CountryID,
國家或地區名稱
FROM dbo.Country ORDER BY國家或地區名稱ASC
) SELECT * FROM CTECountry UNION SELECT'0',' - Select--'

0

在SQL SERVER的情況下,我發現有另一種方法可以做到這一點,儘管它不完美。您添加TOP 999999999999向CTE:

WITH CTECountry as 
(
SELECT TOP 99999999999 
    CountryID, 
    CountryName 
FROM dbo.Country 
ORDER BY CountryName ASC   
) 
SELECT 
* 
FROM CTECountry 
UNION SELECT '0','--Select--' 

的數量並不重要,但你希望它是足夠的,你永遠不會實際地打高。這是一個有點哈克,但如果你需要一個快速的解決方法由於某種原因這個會做

0

添加到@Arch回答,你可以做SQL Server中的以下

WITH CTECountry as 
(
SELECT TOP 100 PERCENT 
    CountryID, 
    CountryName 
FROM dbo.Country 
ORDER BY CountryName ASC   
) 
SELECT 
* 
FROM CTECountry 
UNION SELECT '0','--Select--' 

看到this question