sql - 基于条件的一对多关系的内连接
问题描述
拥有三个表 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
预期结果:地址选择需要基于一个条件;如果存在家庭类型地址,则选择家庭地址,如果不选择办公室类型地址。
解决方案
您可以使用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;
推荐阅读
- php - 从 php 中的 csv 文件中读取第 n 行
- c - 如何在铿锵声中为 llvm ir 生成 phi 指令?
- anaconda - 我无法运行 Spyder(5.0.0 版)
- javascript - 如何使用 jQuery 为多个文本框添加相同的工具提示
- python - 格式化熊猫显示函数输出的最简单方法,每行和列之间的黑色边框线作为 Jupyter 上的网格
- python - 如何在没有功能的脚本上使用 pytest
- search - 使用 VBA 代码从工作表的值范围内搜索字符串。我的数据从 C 列开始,行数是动态的
- c - c - 跨平台的 unicode 进度条
- html - 使用 mat-tab 将水平选项卡转换为垂直选项卡
- google-sheets - 如何从 =importdata 脚本中删除每小时更新?