使用子查询优化SQL查询:地址与机构关联数据查询需求
嘿,我来帮你搞定这个SQL查询需求!针对你说的地址和机构表的两种情况——重复的地址-机构对、一个地址对应多个机构,要实现每个地址输出一行的效果,我给你写了一个清晰的查询方案:
核心思路
首先得先清理掉重复的地址-机构记录,然后统计每个地址关联的唯一机构数量,最后根据数量判断输出:数量为1时显示对应机构名,否则显示你需要的指定内容。
完整SQL代码
WITH unique_orgs AS ( -- 第一步:去除重复的地址-机构对 SELECT DISTINCT Address, Orgname FROM your_table_name -- 记得替换成你的实际表名 ), address_summary AS ( -- 第二步:统计每个地址的唯一机构数,同时提取单机构时的名称 SELECT Address, COUNT(Orgname) AS org_count, MAX(CASE WHEN COUNT(Orgname) OVER (PARTITION BY Address) = 1 THEN Orgname END) AS single_org FROM unique_orgs GROUP BY Address ) -- 第三步:根据机构数输出对应结果 SELECT Address, CASE WHEN org_count = 1 THEN single_org ELSE '多个机构关联' -- 这里替换成你需要的指定内容,比如'请核实机构信息' END AS Orgname FROM address_summary;
代码解释
unique_orgs这个公共表表达式(CTE)先把重复的行去掉,比如你示例里Address2 + Orgname2的两条重复记录会被合并成一条。address_summary负责统计每个地址的机构数量,同时用窗口函数精准提取出那些只有一个关联机构的地址对应的机构名称。- 最后外层的
CASE语句做判断:如果是1对1的关联关系,就显示机构名;否则显示你设定的内容。
如果你的指定内容需要更灵活的处理(比如把多个机构名拼接起来),可以把ELSE部分改成STRING_AGG(Orgname, ', ')(不同数据库语法可能略有差异,比如MySQL用GROUP_CONCAT),不过按你原需求的描述,先给了最通用的方案。
内容的提问来源于stack exchange,提问作者Chris Decker
相关产品推荐
相关产品推荐

