首页 > 解决方案 > 基于条件的一对多关系的内连接

问题描述

拥有三个表 AppUser、AddressLink 和 UserAddress。用户可以链接到两种不同的地址类型:“办公室”或“家庭”。这些表的内部连接导致重复记录并选择所有链接地址。相反,地址选择需要基于条件;如果存在家庭类型地址,则选择家庭地址,如果不存在则选择办公室类型地址。我如何使用内部联接来实现这一点?有什么建议么?

在此处输入图像描述

当前 SQL 查询:

SELECT
    AU.UserId
   ,AU.UserName
   ,AL.AddressLinkId
   ,AL.AddressType
   ,UA.AddressId
   ,UA.City
   ,UA.ZipCode
   ,UA.CountyCode
FROM AppUser AU
INNER JOIN AddressLink AL
    ON AU.UserId = AL.UserId
INNER JOIN UserAddress UA
    ON UA.AddressId = AL.AddressId

结果: 在此处输入图像描述

预期结果:地址选择需要基于一个条件;如果存在家庭类型地址,则选择家庭地址,如果不选择办公室类型地址。

在此处输入图像描述

标签: sqlsql-servertsql

解决方案


您可以使用apply

select . . .
from appusers u outer apply
     (select top (1) alh.*
      from addresslink alh
      where alh.userid = u.userid 
      order by (case when alh.addresstype = 'Home' then 1 else 2 end)
     ) alh left join
     addresses a
     on alh.addressid = a.addressid;

推荐阅读