2013-02-21 25 views
3

下面是我的大型SQL查詢的一部分,我花了幾個小時後找不到解決方案在上面。 我的要求是隻能在RaceNumber升序排序記錄,並把空的記錄上底部如果SELECT DISTINCT被指定,那麼ORDER BY項目必須出現在選擇列表中......我用了幾個小時但沒有找到任何東西

SELECT DISTINCT TP.racenumber, 
       TP.teamid, 
       TP.teamname 
FROM tblteamprofile TP 
ORDER BY CASE 
      WHEN TP.racenumber IS NULL THEN 1 
      ELSE 0 
      end, 
      TP.teamid, 
      TP.teamname 

任何人可以幫助我,這僅僅是我卑微的請求......!請

+0

什麼是您使用RDBMS? – 2013-02-21 16:27:15

+0

@TimSchmelter它是MSSQL – Kermit 2013-02-21 16:28:56

+0

[ORDER BY項目必須出現在選擇列表中,如果SELECT DISTINCT被指定錯誤](http://stackoverflow.com/questions/15533128/order-by-items-must-appear-in -select-list-if-select-distinct-is-specified-er) – nalply 2013-05-15 09:07:23

回答

11

BY項添加缺少的爲了將SELECT列表:

SELECT DISTINCT 
    TP.RaceNumber, 
    CASE WHEN TP.RaceNumber is null THEN 1 ELSE 0 END, 
    TP.TeamID,  
    TP.TeamName  
FROM 
    tblTeamProfile TP 
ORDER BY 
    CASE WHEN TP.RaceNumber is null THEN 1 ELSE 0 END, 
    TP.TeamID, 
    TP.TeamName 

正如因子神祕在評論中機敏地指出,可以簡化查詢,如果您的RDBMS允許重新使用的別名ORDER BY子句:

SELECT DISTINCT 
    TP.RaceNumber, 
    CASE WHEN TP.RaceNumber is null THEN 1 ELSE 0 END AS RaceNumberFlag, 
    TP.TeamID,  
    TP.TeamName  
FROM 
    tblTeamProfile TP 
ORDER BY 
    RaceNumberFlag, 
    TP.TeamID, 
    TP.TeamName 
+0

在DRY的原因中,在select子句中給出'case'別名,並按 – 2013-02-21 16:28:14

+2

的順序通過別名引用它。感謝您的評論。不幸的是,並非所有RDBMS都允許這樣做。 – bernie 2013-02-21 16:28:42

+0

+1 - 當使用distinct時,SQL Server需要在select語句中使用字段的所有順序。很好的答案。 – sgeddes 2013-02-21 16:28:49

0

也許ORDER BY應該是這樣的:

order by (case when tp.RaceNumber is NULL then 1 else 0 end), 
     tp.RaceNumber 

如果您想通過RaceNumber進行訂購,爲什麼在查詢中有TeamId和TeamName?

3

問題是如果數據庫引擎不是SELECT DISTINCT查詢中的SELECT列表的一部分,數據庫引擎不知道如何選擇該特定值。

您應該能夠使用的GROUP BY代替DISTINCT如果你不想選擇列:

SELECT TP.racenumber, TP.teamid, TP.teamname 
FROM tblteamprofile TP 
GROUP BY TP.racenumber, TP.teamid, TP.teamname, 
    CASE WHEN TP.racenumber IS NULL THEN 1 ELSE 0 END 
ORDER BY CASE WHEN TP.racenumber IS NULL THEN 1 ELSE 0 END, 
    TP.teamid, TP.teamname 
+0

我提高了這一點,因爲它需要對代碼進行最少侵入性的更改,並且不會更改輸出。我的回答涉及嵌套子查詢,但我更喜歡這個,所以我不會打擾張貼。乾杯! – 2013-02-21 17:32:03

+1

你爲什麼在GROUP BY中包含'CASE'? – Yann39 2014-03-04 10:04:03

+0

@ Yann39你說得對,如果'TP.racenumber'已經在GROUP BY中,那應該沒關係。 – 2014-03-05 07:17:03

相關問題