首页 > 解决方案 > 选择两列具有相同值的所有行?

问题描述

我正在使用 SQL,并且想知道如何获得 2 列中的值相等的所有行。例如,想象一下这张表:

+----+---------+
| ID | Version |
+----+---------+
| AB |       1 |
| AB |       1 |
| BA |       2 |
| BA |       2 |
| CB |       1 |
+----+---------+

我想选择 ID 和版本与 ID 和版本列中具有相同值的其他行匹配的所有行。换句话说,我想找到重复的值。所以所需的输出将是:

+----+---------+
| ID | Version |
+----+---------+
| AB |       1 |
| AB |       1 |
| BA |       2 |
| BA |       2 |
+----+---------+

我将如何在超过一百万行的表中尽可能高效地执行此操作?

标签: sqldatabase

解决方案


最简单的方法可能是窗口函数:

select t.*
from (select t.*,
             count(*) over (partition by id, version) as cnt
      from t
     ) t
where cnt >= 2;

如果您在(id, version)( 或(version, id)) 上有一个索引,那么数据库引擎应该能够利用它。


推荐阅读