sql - 选择两列具有相同值的所有行?
问题描述
我正在使用 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 |
+----+---------+
我将如何在超过一百万行的表中尽可能高效地执行此操作?
解决方案
最简单的方法可能是窗口函数:
select t.*
from (select t.*,
count(*) over (partition by id, version) as cnt
from t
) t
where cnt >= 2;
如果您在(id, version)
( 或(version, id)
) 上有一个索引,那么数据库引擎应该能够利用它。
推荐阅读
- java - 如何将 JScrollPanel 添加到之前添加的标签组件?
- python - Discord.py on_message 破坏其余命令?
- mysql - 需要考虑 3 个不同的其他列来计算客户
- node.js - EJS 页面未加载图像
- python - 如果匹配条件,则插入行或更新行。有重复的术语,不是唯一的
- flutter - 如何使bottomBar背景透明并使延伸主体变为真实
- python - networkx - 遍历从节点 A 到节点 A 的所有路径,执行操作,找到最大值
- sql - SQL - 删除小数并将其值包含在数字中
- sql - 如何使 pg_search 更快?
- google-colaboratory - Colab 的 Huggingface AlBert 标记器 NoneType 错误