如果表 2 中同时定义了 333 和 AAA 怎么办?我将假设您只希望每个 DeviceName 返回一行,这意味着您需要使用外连接两次加入表 2:
select DeviceName,
t2a.ProgramName,
t2b.ProgramName as AltProgramName
from table1 t1
left outer join table2 t2a
on t1.DeviceID = t2a.PhoneID
left outer join table2 t2b
on t1.AlternateID = t2b.PhoneID
如果您只想列出一个 ProgramName,并且可以确定在两者都存在的情况下使用的优先级,您可以执行以下操作:(假设 DeviceID 胜过 AlternateID)
select DeviceName,
coalesce(t2a.ProgramName, t2b.ProgramName) as AltProgramName
from table1 t1
left outer join table2 t2a
on t1.DeviceID = t2a.PhoneID
left outer join table2 t2b
on t1.AlternateID = t2b.PhoneID
如果您希望第一个程序列始终包含一个值,并且如果两者都存在,则仅在第二列中列出一个值,然后
select DeviceName,
coalesce(t2a.ProgramName, t2b.ProgramName) as ProgramName1,
case when t2a.ProgramName is not null then t2b.ProgramName end as ProgramName2
from table1 t1
left outer join table2 t2a
on t1.DeviceID = t2a.PhoneID
left outer join table2 t2b
on t1.AlternateID = t2b.PhoneID
编辑
我假设查询被用于报告目的,在这种情况下,您很可能只需要每个设备一行。
我刚刚意识到为什么 OP 可能希望每个设备返回多行。如果查询用于定义按任一名称查找设备的视图,则需要多行。
Jan 的答案非常适合查找视图。但是,根据数据库引擎的查询优化器和表的大小,它的性能可能好也可能不好。如果表非常大,那么您将需要索引查找。带有 OR 条件的连接可能会阻止某些系统上的索引查找。使用 UNION ALL 的等效查询可能支持更多系统上的索引查找。
select DeviceName,
ProgramName
from table1 t1
join table2 t2
on t1.DeviceID = t2.PhoneID
union all
select DeviceName,
ProgramName
from table1 t1
join table2 t2
on t1.AlternateID = t2.PhoneID