Тест объединения и несуществования кажется подходящим для этого
select *
from company C
inner join CompanyAddress A on A.companyID = C.companyID
where A.AddressType = 1
union all
select *
from company C
LEFT join CompanyAddress A on A.companyID = C.companyID
and A.AddressType = 2
and not exists (
select *
from CompanyAddress B
where B.companyID = C.companyID
and B.AddressType = 1)
Во 2-й части используется левое соединение, так что компании, у которых нет ни типа адреса 1, ни 2, все равно будут отображаться.
Либо так, либо используйте левое соединение с AddressType = 2, которое срабатывает только при сбое первого соединения (тип = 1).
select C.*,
coalesce(A.addressType, B.addressType) addressType,
coalesce(A.streetname, B.streetname) streetname
from company C
left join CompanyAddress A on A.companyID = C.companyID and A.AddressType = 1
left join CompanyAddress B on A.companyID is null
AND B.companyID = C.companyID and B.AddressType = 2
Как видите, это сложнее, поскольку каждый столбец из Address имеетпройти через coalesce
между А и В.