从两个字段中创建不同数据的查询,其中一个字段通常为NULL

时间:2010-08-24 17:16:42

标签: sql sql-server

我有一个玩家表,一个团队表和一个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 个答案:

答案 0 :(得分:1)

正如Martin所说,这是未经测试的:

;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