多表连接查询返回重复行求助:预期5条唯一行实际得30条
嘿,这个问题我太熟了——你遇到的是典型的笛卡尔积坑!
问题出在哪?
你现在的查询用逗号把三个表串起来,但没告诉数据库这三个表之间该怎么关联(比如Account和Application、Account和account_version通过哪个字段匹配)。数据库就会把每个表符合条件的行全部交叉组合,也就是笛卡尔积。举个例子:如果Account筛选后有1行,Application有6行,account_version有5行,1×6×5=30,正好是你看到的重复结果。
另外,你的子查询a.acc_id in (Select acc_id from account where acc_name='GGG')完全可以简化成a.acc_name='GGG',没必要绕一圈。
解决方案:给表加上正确的关联条件
首先你得明确三个表之间的关联字段(一般是外键,比如acc_id),然后用JOIN语法明确连接关系——这比逗号分隔的旧写法更清晰,也不容易出错。
第一步:用INNER JOIN建立关联
假设Application和Account通过acc_id关联,account_version也和Account通过acc_id关联,重写查询如下:
SELECT a.project_id, a.acc_name, a.project_name, a.iot, a.acc_id, a.active, b.app_fte, b.contact_person, c.cost_call_date FROM Account a INNER JOIN Application b ON b.acc_id = a.acc_id -- 关联Account和Application INNER JOIN account_version c ON c.acc_id = a.acc_id -- 关联Account和account_version WHERE a.acc_name = 'GGG' AND EXTRACT(MONTH FROM c.cost_call_date) = 3;
第二步:处理关联表的多记录重复
如果执行上面的查询后还是有重复,那说明某个关联表里(比如Application或account_version)同一个acc_id对应多条记录。这时候你要根据业务需求选处理方式:
- 如果你只需要唯一的行,直接加
DISTINCT关键字去重:
SELECT DISTINCT a.project_id, a.acc_name, a.project_name, a.iot, a.acc_id, a.active, b.app_fte, b.contact_person, c.cost_call_date FROM Account a INNER JOIN Application b ON b.acc_id = a.acc_id INNER JOIN account_version c ON c.acc_id = a.acc_id WHERE a.acc_name = 'GGG' AND EXTRACT(MONTH FROM c.cost_call_date) = 3;
- 如果需要从多记录里取特定值(比如最新的、最大的),用聚合函数+GROUP BY:
SELECT a.project_id, a.acc_name, a.project_name, a.iot, a.acc_id, a.active, MAX(b.app_fte) AS app_fte, -- 取最大的app_fte,也可以用MIN、MAX等 MAX(b.contact_person) AS contact_person, -- 或者根据业务逻辑选合适的聚合方式 c.cost_call_date FROM Account a INNER JOIN Application b ON b.acc_id = a.acc_id INNER JOIN account_version c ON c.acc_id = a.acc_id WHERE a.acc_name = 'GGG' AND EXTRACT(MONTH FROM c.cost_call_date) = 3 GROUP BY a.project_id, a.acc_name, a.project_name, a.iot, a.acc_id, a.active, c.cost_call_date;
可选:用LEFT JOIN保留无匹配的行
如果有些Account没有对应的Application或account_version记录,你还想保留这些Account的行,可以把INNER JOIN换成LEFT JOIN。
内容的提问来源于stack exchange,提问作者Kkunal
相关产品推荐
相关产品推荐

