mysql - SQL 过滤掉具有多个值的 id
问题描述
我有以下格式的 MySQL 表
id c1 c2
---------------------
id1 c1v1 c2v1 -> keep id1 even it has duplicates
id1 c1v1 c2v1
id2 c1v2 c2v2 -> filter out id2 because it has various c1, c2
id2 c1v2 c2v3
id3 c1v3 c2v4
....
预期输出:
id c1 c2
---------------------
id1 c1v1 c2v1
id3 c1v3 c2v4
....
我只想保留 id 仅具有唯一 c1、c2 值的记录。我确实有一个解决方案,但它需要两次全表扫描,包括一个效率非常低的连接,我想知道是否有更好的方法来做到这一点。
select
distinct id, c1, c2
from table
inner join
(select
id,
count(distinct c1, c2) as counts
from table
group by id
having counts = 1) tmp
on table.id = tmp.id
解决方案
您可以在不同的 c1/c2 值上使用 self 执行此操作,只保留第二个表LEFT JOIN
中没有匹配行的那些行(即相同的不同值):id
SELECT DISTINCT t1.id, t1.c1, t1.c2
FROM test t1
LEFT JOIN test t2 ON t2.id = t1.id AND (t2.c1 != t1.c1 OR t2.c2 != t1.c2)
WHERE t2.id IS NULL
输出:
id c1 c2
id1 c1v1 c2v1
id3 c1v3 c2v4
推荐阅读
- python - 使用 Python xlsx writer 条件格式突出显示单元格中的标记列表
- wpf - 是否可以使用 XAML 岛和 WindowsXamlHost 在 WPF 中包含自定义 C++\WinRT UWP 控件?
- python - 在 PyTrends 中循环多个单词时收到列表索引超出范围错误?
- xml - 如何配置 BaseX 以在 VS Code 中使用
- kubernetes - 如何使用 Prometheus Operator 将 PrometheusRule 与 AlertmanagerConfig 匹配
- powershell - 结束,未调用循环外函数,添加运行计数
- azure-data-factory - 迭代多个属性 ARM 模板
- bash - 如何为文件搜索和自定义搜索配置 bash 自动完成功能?
- javascript - 来自 URL 的元标记(不和谐)
- unity3d - 下拉 - TextMeshPro 不响应 Unity 2D 中的鼠标点击