可视化工具仅支持单源查询,合并三张无关表后SQL结果重复问题求助
嘿,我完全懂这种被工具限制+多表合并出问题的烦躁!你的核心问题是:三张表合并后,Princess出现了两行重复数据,而你需要每条狗对应唯一一行,还要基于体重匹配来修正这个结果对吧?
先帮你拆解问题本质:出现重复行大概率是因为其中某张表(比如体重表)里Princess有多条记录,直接关联后就会产生笛卡尔积式的重复。下面给你几个针对性的解决方案,你可以根据自己的实际需求选:
方案1:取Princess的最新体重(最常用场景)
如果你的体重表有日期字段,想拿每条狗的最新体重数据,用窗口函数就能精准定位唯一行:
SELECT d.dog_name, wr_latest.weight, hi.vaccination_status -- 替换成你需要的其他表字段 FROM dogs d LEFT JOIN ( -- 给每条狗的体重记录按日期倒序编号,取最新的那一条 SELECT dog_id, weight, ROW_NUMBER() OVER (PARTITION BY dog_id ORDER BY record_date DESC) AS rn FROM weight_records ) wr_latest ON d.dog_id = wr_latest.dog_id AND wr_latest.rn = 1 LEFT JOIN health_info hi ON d.dog_id = hi.dog_id;
这样每个狗只会关联到自己最新的那一条体重数据,自然不会出现重复行。
方案2:匹配特定体重值
如果你明确知道Princess需要匹配的体重(比如12kg),直接在连接条件里加筛选就行:
SELECT d.dog_name, wr.weight, hi.vaccination_status FROM dogs d LEFT JOIN weight_records wr ON d.dog_id = wr.dog_id AND wr.weight = 12 -- 指定目标体重 LEFT JOIN health_info hi ON d.dog_id = hi.dog_id;
要是你是按特定日期的体重匹配,把wr.weight = 12换成wr.record_date = '2024-05-20'就行。
方案3:把所有体重聚合到一行(如果需要保留全部体重)
如果你不想丢弃体重数据,只是要把同一只狗的多条体重合并成一个字段,可以用字符串聚合函数:
-- PostgreSQL版本 SELECT d.dog_name, STRING_AGG(wr.weight::TEXT, ', ') AS all_weights, -- 用逗号分隔所有体重 hi.vaccination_status FROM dogs d LEFT JOIN weight_records wr ON d.dog_id = wr.dog_id LEFT JOIN health_info hi ON d.dog_id = hi.dog_id GROUP BY d.dog_name, hi.vaccination_status; -- MySQL版本 SELECT d.dog_name, GROUP_CONCAT(wr.weight SEPARATOR ', ') AS all_weights, hi.vaccination_status FROM dogs d LEFT JOIN weight_records wr ON d.dog_id = wr.dog_id LEFT JOIN health_info hi ON d.dog_id = hi.dog_id GROUP BY d.dog_name, hi.vaccination_status;
这样每条狗只会有一行,体重信息也都保留在一个字段里。
核心思路就是:要么筛选出单条匹配的体重记录,要么把多条体重记录聚合为单个字段,确保最终结果里每条狗唯一对应一行。如果你的表结构和我假设的有出入,比如体重数据存在其他表,只要调整连接逻辑和筛选条件就行~
内容的提问来源于stack exchange,提问作者S.Patt
相关产品推荐
相关产品推荐

