我有一个玩家表,一个团队表和一个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,来实现这一点吗?
答案 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