Sql server 根据所需的数据优先级,仅选择一条(非顶部)记录

Sql server 根据所需的数据优先级,仅选择一条(非顶部)记录,sql-server,tsql,Sql Server,Tsql,我有一个子查询,它是大型查询的一部分,但实际上我认为这个问题与子查询无关。但是,如果我错了,我会很高兴地发布整个内容 我有一个人可能有4个或5个或8个或0个等条目的记录。我们只想要一张唱片,但我们有一个偏好。如果A记录不存在,我们将使用B记录等 最初我是加入到桌子上的 ……剪断 LEFT JOIN [COMMUNICATION] Comm ON Peeps.PEOPLE_ID = Comm.PEOPLE_ID 并取得如下成果: ID FIRST LAST A

我有一个子查询,它是大型查询的一部分,但实际上我认为这个问题与子查询无关。但是,如果我错了,我会很高兴地发布整个内容

我有一个人可能有4个或5个或8个或0个等条目的记录。我们只想要一张唱片,但我们有一个偏好。如果A记录不存在,我们将使用B记录等

最初我是加入到桌子上的

……剪断

LEFT JOIN [COMMUNICATION] Comm ON Peeps.PEOPLE_ID = Comm.PEOPLE_ID
并取得如下成果:

  ID      FIRST     LAST        ADDY     BIZ        CELL        FAX         HOME
21930   Person      Name        Addy    3237532500  NULL        NULL        NULL
21930   Person      Name        Addy    NULL        3237910815  NULL        NULL
21930   Person      Name        Addy    NULL        NULL        3235869055  NULL
21930   Person      Name        Addy    NULL        NULL        NULL        3238660704
21930   Person      Name        Addy    NULL        NULL        NULL        NULL
在通信表中,我确实有5条记录,因此这不是连接问题

现在我只想在这个首选项中有一行。。。。 家 细胞 生意 传真

因此,我的第一次尝试是使用TOP(1)执行子查询,但当然,它只返回表的顶行。我在cte上读过,对他们很熟悉,但在这种情况下,我需要能够加入,不知道你会怎么做。让cte按照所需的业务优先级和2对记录进行排序。如何加入它

如果你能给我指出正确的方向或告诉我该学什么,我会很乐意做我自己的工作


谢谢

没有进一步的信息,我想说的是:

create table #temp_table (
    [id] int,
    [first] varchar(50),
    [last] varchar(50),
    [addy] varchar(50),
    [biz] varchar(50) null,
    [cell] varchar(50) null,
    [fax] varchar(50) null,
    [home] varchar(50) null 
)

insert into #temp_table
select 21930, 'Person', 'Name', 'Addy', '3237532500', null, null, null union all
select 21930, 'Person', 'Name', 'Addy', null, '3237910815', null, null union all
select 21930, 'Person', 'Name', 'Addy', null, null, '3235869055', null union all
select 21930, 'Person', 'Name', 'Addy', null, null, null, '3238660704' union all
select 21930, 'Person', 'Name', 'Addy', null, null, null, null


;with ordered as(
    select
        *,
        rn = row_number() over( partition by id 
                                order by 
                                    case
                                        when home is not null then 1
                                        when cell is not null then 2
                                        when biz is not null then 3
                                        when fax is not null then 4
                                        else 9999
                                    end
                               )
    from #temp_table 
)
select 
    [id],
    [first],
    [last],
    [addy],
    [biz],
    [cell],
    [fax],
    [home]
from ordered 
where 
    rn = 1

drop table #temp_table

为什么同一个人有5排?您需要显示完整的查询。