条件DB2SQL查询

条件DB2SQL查询,sql,db2,Sql,Db2,假设我有一个名为“Company”的表,表的键是CompanyID 还有另一个相关的表名为“CompanyAddress”,它具有CompanyID外键,因此可以很容易地建立连接 对于给定的公司,此CompanyAddress表可以有多个地址,例如AddressType=1或AddressType=2 获取字段的join etc很简单,但是我需要一个条件,在这里我查询地址,如果有,使用AddressType=1;如果没有,使用AddressType=2 目前,我正在考虑创建一个联合并删除重复项,

假设我有一个名为“Company”的表,表的键是CompanyID 还有另一个相关的表名为“CompanyAddress”,它具有CompanyID外键,因此可以很容易地建立连接

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

获取字段的join etc很简单,但是我需要一个条件,在这里我查询地址,如果有,使用AddressType=1;如果没有,使用AddressType=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

正如您所看到的,这是比较困难的,因为Address中的每一列都必须经过A和B之间的
合并。

A Union and not exists测试似乎是实现这一点的方法

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

正如您所看到的,由于Address中的每一列都必须经过A和B之间的
合并

通过使用OLAP函数实现这一点(如果您使用的是DB2 for Linux/UNIX/Windows),实际上非常简单。我猜到了companyAddress表中的一些列名,但“魔力”在于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;

通过使用OLAP函数来实现这一点(如果您使用的是DB2 for Linux/UNIX/Windows),实际上非常简单。我猜到了companyAddress表中的一些列名,但“魔力”在于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;