我正在执行一个SQL查询(SQL Server Managmenet Studio),该查询生成一个地址列表。一方可以有两种地址:
我希望查询以下内容。如果该方有通讯地址,则仅应选择该地址,否则(即无通讯地址)应选择具有实际地址的行。结果是,对于每一方,只能选择一个地址。
我现在拥有的查询包含很多联接,因为当事方在贷款上扮演角色,但可以简化为:
SELECT Party.Name, Address.AddressLine
FROM Party
LEFT OUTER JOIN Address on (Party.AddressID = Address.ObjID)
表Address包含一列UsageID,分别为PhysicalAddress和CorrespondenceAddress的值分别为1和2。
我将如何实现这一目标? 提前致谢。
答案 0 :(得分:0)
以下是使用row_number()
的一种选择:
select *
from (
select p.Name, a.AddressLine,
row_number() over (partition by p.name order by a.usageid desc) rn
from Party p
left join Address a on p.AddressID = a.ObjID
) t
where rn = 1
如果存在任何地址,它将返回usageid desc
的第一个顺序,如果存在,则应该首先返回CorrespondenceAddress
。
答案 1 :(得分:0)
根据我的理解,
create table #party(id int identity(1,1), pAddr int, cAddr int)
create table #addr (id int identity(1,1), name varchar(1))
insert into #party(pAddr,cAddr) values (3,null), (1,1),(2,8),(3,3),(4,null),(4,5)
insert into #addr(name) values ('a'),('e'),('d'),('g')
select p.id
, case when p.cAddr is not null then p.cAddr -- Here, checking whether,
else p.pAddr -- the corresponding address is null or not.
end Addresses
, name
from #party p
join #addr a
on p.id = a.id
感谢您回复,如果查询需要任何更新... !!