在 SQL 中查找重复的值对
Posted
技术标签:
【中文标题】在 SQL 中查找重复的值对【英文标题】:Finding duplicate value pairs in SQL 【发布时间】:2012-12-08 08:38:30 【问题描述】:我有一个数据库,它使用用户 ID 存储名字和姓氏。该表如下所示:
uid value
1 Fred
1 Keller
2 Tim
2 LaChef
3 Adam
3 Adam
有一个重复的uid
很好,但是我想找到所有名字和姓氏相同的条目吗? Like uid
3. 有什么 SQL 想法吗?
【问题讨论】:
为什么不运行查询来检查重复项,或者您要问其他问题? 你怎么知道是名字还是姓氏? 区分大小写重要吗? 请用 4 Adam 4 Sandler 扩展样本数据,并在查询中发布预期结果。 您的数据没有名字和姓氏。您能否修复数据以匹配您的问题? 【参考方案1】:试试这个:
SELECT uid FROM tablename
GROUP BY uid, name HAVING COUNT(*) = 2;
【讨论】:
+1 但对于更一般的情况,我会选择 COUNT(*) > 1 尽管它回答了问题:o) 是的,但是这里我们每个 id 有 2 个条目,所以更喜欢 count(*)=2 米歇尔如果你阅读问题而不是问题会说找到所有具有相同名字和姓氏的ID。它不会说出具有不同 id 的名称 正如我理解它所说的问题,正如我之前所说的,现在我们要求亚当他想要什么。 请注意,这可能会返回 null 重复项,这可能是也可能不需要【参考方案2】:要仅返回每个“重复”的单个副本,则:
SELECT t.uid
, t.value
FROM mytable t
GROUP
BY t.uid
, t.value
HAVING COUNT(1) > 1
ORDER
BY t.uid
, t.value
要返回重复的“所有”条目,而不仅仅是一个副本,并且如果您不需要返回任何 NULL 值,那么:
SELECT a.uid
, a.value
FROM mytable a
JOIN ( SELECT t.uid
, t.value
FROM mytable t
GROUP
BY t.uid
, t.value
HAVING COUNT(1) > 1
) d
ON d.uid = a.uid
AND d.value = a.value
ORDER
BY a.uid
, a.value
如果您确实想返回 NULL(NULL 是重复的),则将 ON 子句中的比较运算符更改为 null 安全的相等比较:<=>
ON d.uid <=> a.uid
AND d.value <=> a.value
【讨论】:
在 SQL SERVER 2012 上产生错误,但如果 ANSI_NULLS 为 ON,则不会考虑 NULL 重复 @MauricioQuintana:是的。<=>
空安全比较运算符是 SQL 标准的 mysql 扩展。 SQL Server 不支持该运算符。 (问题被标记为“mysql”,而不是“sql-server”。)OP 说他想识别“所有具有相同名字和姓氏的条目”。 OP 可能希望将 NULL 视为与 NULL“相同”。具有NULL
值的多行将由GROUP BY
“分组”在一起,并且各个行确实有助于计数。 <=>
解决的问题与重复无关;这是关于返回具有 NULL
值的行。
@MauricioQuintana:我们使用 a <=> b
在 MySQL 中获得的行为可以通过编写 (a=b OR (a IS NULL AND b IS NULL))
在 SQL Server 中进行模拟。以上是关于在 SQL 中查找重复的值对的主要内容,如果未能解决你的问题,请参考以下文章