选择取决于连接的语句

时间:2017-02-15 17:11:09

标签: sql-server

需要条件分支的帮助。必须做一个报告来获取会员数据和地址是其中一个领域。如果地址属于某种类型,则逻辑会有所不同,因此在进行连接时会遇到问题,并在CASE2行时选择它。

如果地址类型既不是医院也不是设施,则加入很简单。如果确实是医院或设施类型,则必须返回NON医院和设施类型的最新活动地址。

Addresses Table
   ADDRESS_ID, PERSON_ID, ADDRESS_LINE1, ADDRESS_LINE2

Person Table
   PERSON_ID, FIRSTNAME, LASTNAME

select distinct
P.FirstName, P.LastName, PH.HomePhone1,
A.Address_Line1 --check below for my pseudo code
from Person as P
join Phones as PH
    on P.Person_ID = PH.Person_ID
join Addresses as A
    on P.Person_ID = A.Person_ID
    and
    (
          (A.Preferred = 'Y' and A.Type not in ('Hospital','Facility')) --CASE1
       or (A.Preferred = 'Y' and A.Type in ('Hospital','Facility')) -- CASE2
    )

CASE2中的A.Address_Line1需要来自

之类的东西
Select TOP 1 ADDRESS_ID from Addresses where PERSON_ID = P.PERSON_ID and A.TYPE not in ('Facility','Hospital') and A.Preferred = 'Y'

不确定如何直接回复ADyson,所以在这里添加。 我错过了如何获取CASE2的AddressLine1的概念,我发布的代码是我到目前为止所拥有的。除了使用CTE和游标之外,我没有看到这样做的简单方法。不是远景的sql大师。

CASE1和CASE2正是我对解决方案的期望,所以它很可能不符合我的要求,但它就是我的全部。

我需要知道如何在SQL中实现这个概念以正确填充A.AddressLine1。

var addressLine1 = string.empty;
if(address.Preferred = true && address.Type not in ('Hospital','Facility'))
  addressLine1 = address.addressLine1;
if(address.Preferred = true and address.Type in ('Hospital','Facility'))
  addressLine1 = select top 1 addressLine1 from Addresses where address.Preferred = 'Y' and address.Type not in ('Hospital','Facility')

上面的伪代码必须以某种方式与顶级SQL语句和连接一起使用。只需要一个指向如何在SQL中完成它的正确方法的指针。

如果您需要更多详细信息,请与我们联系,谢谢。

1 个答案:

答案 0 :(得分:0)

使用outer apply()

这将为每个人返回一个非医院/设施地址。如果有首选非医院/设施地址,则会先返回该地址,否则会根据added_date desc返回最近添加的地址。

select 
    P.FirstName
  , P.LastName
  , PH.HomePhone1
  , x.Address_Line1
  --, x.Type 
  --, x.Preferred  
from Person as P
join Phones as PH
    on P.Person_ID = PH.Person_ID
outer apply (
  select top 1 a.Address_Line1
    --, a.Type
    --, a.Preferred
  from Addresses as A
  where P.Person_ID = A.Person_ID
    and A.[Type] not in ('Hospital','Facility')
   order by 
        case when A.Preferred = 'Y' then 0 else 1 end asc
      , A.added_date desc
    ) as x