编写SQL查询:获取同时拥有主副地址的ParentTable记录姓名
需求:查询同时拥有主、副地址的父表记录名称
编写SQL查询语句,从parentTable中获取那些在childTable里同时存在primary(主地址)和secondary(副地址)类型关联数据的记录的name字段。
parentTable结构与数据
======================================= parentid(PK), name, timestamp 1, Dr John, 2022-01-12 00:00:00 2, Dr Smita, 2022-02-13 00:00:00 3, Dr Roy, 2022-08-13 00:00:00 4, Dr Shawn, 2022-08-14 00:00:00
childTable结构与数据
======================================= childId(PK), parentId(FK to parentTable.parentid), addressType, location, timestamp 1, 1, primary, Pune, 2022-01-12 00:00:00 2, 1, secondary, Mumbai, 2022-01-12 00:00:00 3, 2, primary, Delhi, 2022-01-13 00:00:00 4, 3, primary, Dubai, 2022-08-13 00:00:00 5, 3, secondary, London, 2022-08-13 00:00:00 6, 4, primary, Banglore, 2022-08-14 00:00:00
预期查询结果
Name Dr John Dr Roy
解决方案
提供两种常用的SQL实现方式:
方法一:分组统计法
关联子表后分组,统计每个父ID对应的不同地址类型数量,筛选出数量为2的记录:
SELECT p.name FROM parentTable p JOIN childTable c ON p.parentid = c.parentId WHERE c.addressType IN ('primary', 'secondary') GROUP BY p.parentid, p.name HAVING COUNT(DISTINCT c.addressType) = 2;
方法二:双内连接法
分别关联子表中主地址和副地址的记录,只有同时存在两种地址的父记录才会被保留:
SELECT p.name FROM parentTable p JOIN childTable c1 ON p.parentid = c1.parentId AND c1.addressType = 'primary' JOIN childTable c2 ON p.parentid = c2.parentId AND c2.addressType = 'secondary';
两种方法都能得到预期结果,可根据数据表规模和索引情况选择更高效的方案。
内容的提问来源于stack exchange,提问作者Akshay Lowanshi
相关产品推荐
相关产品推荐

