You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中高效查询映射至同一to值的行?

高效SQL实现:筛选映射至同一to值的多行记录

当然有高效的实现方式!我来给你分享两种常用且性能不错的方法,适用于大多数主流数据库(MySQL、PostgreSQL、SQL Server等),完全能满足你的需求。

方法一:使用窗口函数(推荐,简洁高效)

窗口函数是现代数据库的强大特性,它可以在一次表扫描中完成分组统计,不需要额外的关联操作,性能非常出色。我们可以用COUNT() OVER (PARTITION BY to)来计算每个to值对应的行数,然后筛选出行数大于1的记录:

SELECT id, `from`, `to`
FROM (
    SELECT 
        id, `from`, `to`,
        -- 按to分组统计每组的行数
        COUNT(*) OVER (PARTITION BY `to`) AS to_count
    FROM your_table_name
) t
-- 只保留to值出现多次的记录
WHERE to_count > 1
-- 按to值和id排序,匹配你想要的结果格式
ORDER BY `to`, id;

注意点:

  • from是SQL的关键字,所以需要用反引号(MySQL)、双引号(PostgreSQL)或者方括号(SQL Server)包裹,避免语法错误。
  • 如果你的to列上有索引,数据库会自动利用索引优化窗口函数的计算,效率会更高。

方法二:使用分组子查询+JOIN

如果你使用的数据库不支持窗口函数(比如一些老版本的MySQL),这种方法同样高效:先通过分组找出所有出现多次的to值,再和原表关联筛选出对应的记录:

SELECT t.id, t.`from`, t.`to`
FROM your_table_name t
INNER JOIN (
    -- 找出所有出现次数大于1的to值
    SELECT `to`
    FROM your_table_name
    GROUP BY `to`
    HAVING COUNT(*) > 1
) sub ON t.`to` = sub.`to`
ORDER BY t.`to`, t.id;

优势:

  • 逻辑清晰,容易理解;如果to列有索引,子查询的分组操作会非常快,关联过程也能利用索引加速。

性能对比

两种方法在数据量较大时都有不错的表现:

  • 窗口函数方法只需要扫描一次表,在现代数据库中优化器会给出最优执行计划,通常是首选。
  • JOIN方法需要两次扫描(子查询一次,关联一次),但如果有合适的索引,性能差距不大。

内容的提问来源于stack exchange,提问作者MvdD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:19:10