条件DB2 SQL查询

时间:2011-02-02 21:03:14

标签: sql db2

让我说我有一个名为“公司”的表,其中包含一个CompanyID的密钥 还有另一个名为“CompanyAddress”的相关表,它具有CompanyID外键,因此可以轻松建立连接。

此CompanyAddress表可以包含给定公司的多个地址,例如AddressType = 1或AddressType = 2

获取字段的连接等是微不足道的,但我想要一个条件,我查询地址,如果它在那里使用AddressType = 1,如果不存在,使用AddressType = 2

目前,我正在考虑进行联合并删除重复项,但必须有更好的方法

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;