让我说我有一个名为“公司”的表,其中包含一个CompanyID的密钥 还有另一个名为“CompanyAddress”的相关表,它具有CompanyID外键,因此可以轻松建立连接。
此CompanyAddress表可以包含给定公司的多个地址,例如AddressType = 1或AddressType = 2
获取字段的连接等是微不足道的,但我想要一个条件,我查询地址,如果它在那里使用AddressType = 1,如果不存在,使用AddressType = 2
目前,我正在考虑进行联合并删除重复项,但必须有更好的方法
答案 0 :(得分:2)
联盟并不存在测试似乎是这个方法
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)
第二部分使用左连接,以便仍然显示没有地址类型1和2的公司 或者使用左连接到AddressType = 2,只有在第一个连接(type = 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
正如您所看到的,由于地址中的每一列必须经过A和B之间的coalesce
,因此更难。
答案 1 :(得分:2)
使用OLAP函数执行此操作(如果您使用的是DB2 for Linux / UNIX / Windows)实际上非常简单。我已经猜到了companyAddress表中的一些列名,但是“magic”在rank()函数中:
with preferredAddresses as (
select
companyID,
address,
addresstype,
rank() over (partition by companyID order by addresstype ) as rank
from
companyAddress
)
select *
from
company C,
inner join preferredAddresses A
on c.companyID = A.companyID
where
A.rank = 1;