Sql 如何加入一对多关系以确保仅从左侧返回一行?

Sql 如何加入一对多关系以确保仅从左侧返回一行?,sql,sql-server,tsql,sql-server-2000,Sql,Sql Server,Tsql,Sql Server 2000,很抱歉标题不明确,但以下是我想做的 我有下面两张桌子 TABLE_PERSON | TABLE_PHONE | col_Name | col_Name col_phoneID col_phoneNbr -------- | -------- ----------- ------------ Clark Kent | Clark Kent 1 111-111-1111 Bruce Wayn

很抱歉标题不明确,但以下是我想做的

我有下面两张桌子

TABLE_PERSON | TABLE_PHONE | col_Name | col_Name col_phoneID col_phoneNbr -------- | -------- ----------- ------------ Clark Kent | Clark Kent 1 111-111-1111 Bruce Wayne | Clark Kent 2 222-222-2222 Peter Parker | Peter Parker 2 333-333-3333 | Peter Parker 3 444-444-4444 | Bruce Wayne 3 555-555-5555 | Bruce Wayne 4 666-666-6666 col_名称实际上是一个ID字段,但我使用一个名称来演示。下面是我希望通过使用一条SQL语句得到的结果

col_Name col_phoneNbr -------- ------------ Clark Kent 111-111-1111 Peter Parker 333-333-3333 Bruce Wayne 555-555-5555 phone_ID实际上是一种电话号码,如main、fax、toll free等。因此,在我的输出中,我希望每个人都有一个电话号码,但选择的方式是,如果类型1不可用,选择类型2,如果类型2不存在,选择类型3等。在我的情况下,有6种类型,它们的优先级类似于4>2>1>3>5>6,因此我希望能够只选择第一个可用的数字,如果两者都不存在,则为NULL

在上一个项目中,我使用了一种非常复杂的方法来实现这一点,我将选择所有类型1,然后选择所有类型2,同时使用NOT in子句过滤类型1,然后将两个集合合并在一起。事实上,结果是4盘,对于我拿出的1000多张唱片来说,速度非常慢

我应该提到的是,这是MS SQL Server 2000,所以我不能使用任何2005年的功能


提前谢谢

手机ID的优先级是其数值的简单情况:

select pers.col_Name, ph2.col_phoneNbr
from TABLE_PERSON pers
inner join (select col_Name, min(col_phoneID) from TABLE_PHONE group by col_Name) as ph1 on ph1.col_Name=pers.col_Name
inner join TABLE_PHONE ph2 on ph2.col_Name=pers.col_Name and ph2.col_PhoneID=ph1.col_PhoneID
现在,让我们创建一个映射来处理优先级ID: 试试这个:

create table phone_prio (phone_ID int, prio int);

insert into phone_prio (phone_ID, prio) values (4, 1);
insert into phone_prio (phone_ID, prio) values (2, 2);
insert into phone_prio (phone_ID, prio) values (1, 3);
insert into phone_prio (phone_ID, prio) values (3, 4);
insert into phone_prio (phone_ID, prio) values (5, 5);
insert into phone_prio (phone_ID, prio) values (6, 6);
并更新naive案例:

select pers.col_Name, ph2.col_phoneNbr
from TABLE_PERSON pers
inner join (
    select col_Name, min(pr.prio) as prio
    from TABLE_PHONE ph
    inner join phone_prio pr on pr.phone_ID=ph.col_phoneID
    group by col_Name
) as ph1 on ph1.col_Name=pers.col_Name
inner join phone_prio pr1 on pr.prio=ph1.prio
inner join TABLE_PHONE ph2 on ph2.col_Name=pers.col_Name and ph2.col_PhoneID=pr1.phoneID

您想使用HAVING子句

GROUP by col_phoneID
HAVING col_phoneID = MAX(col_phoneID)
很明显,MAX不是您想要的,因此您可能需要向查询中添加一些内容
但我希望它为您指明了正确的方向。

为了您的利益,我希望加入标准实际上不是某人的名字。当系统中有2+个John Smith时,它将失败。。。
GROUP by col_phoneID
HAVING col_phoneID = MAX(col_phoneID)