如何查询housenumber与street相同但city不同的重复记录?
解决思路与方案
你的需求是找出所有housenumber和street相同但city不同的记录,之前用INNER JOIN返回数据量过大,是因为这种方式会把同组内的记录两两配对,产生大量重复的关联结果——比如每条Berlin记录会和Paris、Viena的记录各关联一次,每条Paris记录又会和Berlin、Viena的记录关联,导致数据冗余。
这里提供两种高效的解决方案:
方法一:利用分组筛选目标组合
先通过分组找出存在多个不同城市的housenumber+street组合,再查询原表中属于这些组合的所有记录:
SELECT housenumber, street, city FROM your_table WHERE (housenumber, street) IN ( SELECT housenumber, street FROM your_table GROUP BY housenumber, street HAVING COUNT(DISTINCT city) > 1 );
这段SQL的逻辑是:子查询先按housenumber和street分组,统计每组中不同城市的数量,只保留数量大于1的组合;外层查询则从原表中提取这些组合的所有记录,正好符合你的预期结果。
方法二:使用窗口函数(适合支持窗口函数的数据库)
如果你的数据库支持窗口函数(如MySQL 8.0+、PostgreSQL、SQL Server等),可以用窗口函数直接统计每组的城市数量,再筛选结果:
SELECT housenumber, street, city FROM ( SELECT housenumber, street, city, COUNT(DISTINCT city) OVER (PARTITION BY housenumber, street) AS city_count FROM your_table ) AS sub WHERE city_count > 1;
窗口函数PARTITION BY housenumber, street会将数据按门牌号和街道分组,COUNT(DISTINCT city)统计每组内的不同城市数,外层筛选出城市数大于1的记录即可。这种方式性能通常更好,尤其是处理大数据表时。
内容的提问来源于stack exchange,提问作者Zifceac Iaroslav
相关产品推荐
相关产品推荐

