2010-08-24 54 views
2

我有一個玩家表,一個表和一個team_players表(使用SQLServer 2005)。並非所有的玩家都在一個團隊中。我想製作一個查詢,它將爲每個非球隊球員返回一行,併爲每個團隊返回一行(即,有一個結果行代表尼克斯隊中所有20名球員,結果排只包含尼克斯隊的team_id ,但是所有非團隊玩家都會在結果集中獲得自己的具有唯一player_id的行)。針對來自兩個字段(其中一個通常爲空)的不同數據進行查詢

目前我試圖讓我的結果集僅僅由一個列的,和我做它像這樣:

SELECT DISTINCT ISNULL(tp.team_id, p.player_id) FROM players p 
LEFT JOIN team_players tp ON tp.player_id = p.id 

我的問題是:我怎樣才能讓這個查詢由團隊訂購與大多數球員DESC,然後由非球隊球員按字母順序排列球員姓名?這可能與我目前的查詢基地?我是否應該使用不同的方法,例如可能是UNION,以使其成爲可能?

回答

1

正如馬丁的情況下,這是未經測試:

;with cteCombineData as (
    select t.id, null as player_name, count(*) as player_count 
     from team t 
      inner join team_players tp 
       on t.id = tp.team_id 
     group by t.id 
    union all   
    select p.id, p.player_name, 0 as player_count 
     from players p 
      left join team_players tp 
       on p.id = tp.player_id 
     where tp.player_id is null 
) 
select id 
    from cteCombineData 
    order by player_count desc, player_name 
+0

看起來這正是我一直在尋找。謝謝喬。說實話,在看到這個回覆之前,我對CTE並不熟悉。時間做一些閱讀:)。 – danjat 2010-08-24 18:32:08

+1

您可以使用[使用通用表格表達式](http://msdn.microsoft.com/zh-cn/library/ms190766.aspx)開始閱讀,然後當您真的準備好玩一些時,請閱讀[遞歸查詢使用公用表表達式](http://msdn.microsoft.com/zh-cn/library/ms186243.aspx) – 2010-08-24 18:35:31

相關問題