Sql 为来自两个字段(其中一个字段通常为空)的不同数据创建查询

Sql 为来自两个字段(其中一个字段通常为空)的不同数据创建查询,sql,sql-server,Sql,Sql Server,我有一个供玩家使用的表、一个供团队使用的表和一个供团队成员使用的表(使用SQLServer2005)。并不是所有的球员都在一个团队中。我想创建一个查询,为每个非团队球员返回一行,为每个团队返回一行(即,有一个结果行代表尼克斯队的所有20名球员,该结果行仅包含尼克斯队的球队id,但所有非团队球员在结果集中都有自己的带有唯一球员id的行) 我目前正在尝试让我的结果集只包含一列,并且我是这样做的: SELECT DISTINCT ISNULL(tp.team_id, p.player_id) FROM

我有一个供玩家使用的表、一个供团队使用的表和一个供团队成员使用的表(使用SQLServer2005)。并不是所有的球员都在一个团队中。我想创建一个查询,为每个非团队球员返回一行,为每个团队返回一行(即,有一个结果行代表尼克斯队的所有20名球员,该结果行仅包含尼克斯队的球队id,但所有非团队球员在结果集中都有自己的带有唯一球员id的行)

我目前正在尝试让我的结果集只包含一列,并且我是这样做的:

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

我的问题是:我如何允许此查询按拥有最多球员描述的球队排序,然后按非球队球员姓名字母顺序排序?对于我当前的查询库,这可能吗?我是否应该使用不同的方法,比如工会,来实现这一点

与马丁的案例一样,这是未经测试的:

;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

看起来这正是我要找的。谢谢你,乔。老实说,在看到这种反应之前,我并不熟悉CTE。是时候做些阅读了:)。你可以从开始阅读开始,然后当你真的准备好阅读时