333 と AAA の両方が表 2 で定義されている場合はどうなりますか? DeviceName ごとに 1 つの行のみを返したいと仮定します。つまり、外部結合を使用して表 2 に 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 を 1 つだけリストし、両方が存在する場合にどちらを使用するかの優先順位を設定できる場合は、次のようにします: (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
最初のプログラム列に常に値を含め、両方が存在する場合は 2 番目の列にのみ値をリストする場合は、次のようにします。
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
編集
クエリはレポート目的で使用されていると想定しました。その場合、デバイスごとに 1 行だけが必要になる可能性が高くなります。
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