Сортировать по вопросу в общем выражении таблицы - PullRequest
5 голосов
/ 23 января 2012

Я использую общее табличное выражение в хранимой процедуре, показанной ниже. Я хочу отобразить название страны в порядке возрастания

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--'

Ответы [ 5 ]

5 голосов
/ 23 января 2012

ORDER BY применяется ко всему СОЮЗУ (которому в этом случае требуется ВСЕ).

В любом случае, только крайние предложения ORDER BY гарантированно сортируют результаты.Внутренние и промежуточные предложения ORDER BY не оказывают никакого влияния и не вызывают ошибок, за исключением некоторых случаев.

WITH CTECountry as
(
SELECT 
   CountryID,
   CountryName 
FROM dbo.Country
)  
SELECT 
   CountryID,
   CountryName 
FROM CTECountry 
UNION ALL
SELECT '0','--Select--'
ORDER BY CountryName ASC   -- goes here

Редактировать, я подозреваю, что вы хотите это после комментария выше

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
1 голос
/ 23 января 2012

Аналогично ответу 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 голосов
/ 30 августа 2017

Добавляя ответ @Arch, вы можете сделать следующее на сервере sql

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

см. этот вопрос

0 голосов
/ 17 июня 2015

В случае 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 голосов
/ 24 января 2012

Решил проблему, изменив запрос на

WITH CTECountry as (ВЫБРАТЬ ROW_NUMBER () OVER (ORDER BY CountryName ASC).Страна ПОРЯДОК ПО СтранаМне ASC
) ВЫБРАТЬ * ИЗ СТРАНОВОГО СОЮЗА ВЫБРАТЬ '0', '- Выбрать -'

...