如何获取在 SQL 中具有重复列组合的记录? [复制]

Posted

技术标签:

【中文标题】如何获取在 SQL 中具有重复列组合的记录? [复制]【英文标题】:How can I get records that have a duplicate combination of columns in SQL? [duplicate] 【发布时间】:2018-11-13 11:04:11 【问题描述】:

如何只获取具有重复列组合的记录?例如,在下表中,我想获取具有 ParentID 和 Date 的重复组合的记录。

+----+----------+-------------------------+
| ID | ParentID |          Date           |
+----+----------+-------------------------+
|  1 |      225 | 2018-05-10 00:00:00.000 |
|  2 |      225 | 2018-05-10 00:00:00.000 |
|  3 |      300 | 2019-25-11 00:00:00.000 |
+----+----------+-------------------------+ 

【问题讨论】:

您确定已经尝试过查询吗? 这个问题在这个网站上被问了十亿次***.com/questions/2594829/… 另外,您使用的是哪个数据库? 添加更多样本数据,并指定预期结果。 @Nerevar - 也许我没有使用正确的词来搜索!这正是我想要的。谢谢! 【参考方案1】:

内部选择获取有重复记录的parentIDdate,外部选择获取包含id的完整数据

SELECT t1.*
FROM your_table t1
INNER JOIN
(
    SELECT parentId, date
    FROM your_table
    GROUP BY parentId, date
    HAVING COUNT(*) > 1
) t2
    ON t1.parentId = t2.parentId AND t1.date = t2.date;

【讨论】:

【参考方案2】:

@juergen 给出了 mysql 对这个问题的回答,但这里是任何支持分析函数的数据库的选项:

SELECT ID, ParentID, Date
FROM
(
    SELECT ID, ParentID, Date, COUNT(*) OVER (PARTITION BY ParentID, Date) cnt
    FROM yourTable
) t
WHERE t.cnt > 1;

一般来说,上述使用分析函数的方法可能会优于传统的连接/聚合方法。但是,这假设您的数据库支持上述查询。

【讨论】:

您的回答似乎表明,MySQL 不支持这一点。真的是这样吗?我以为 MySQL 8.0.2 引入了窗口函数。 @MichaWiedenmann 是的,确实如此。但是很少有人在生产中使用这个版本(我什至不知道它是否可用,例如通过 RDS)。因此,大多数 MySQL 问题都假设版本早于 8。 如果你能改写你的答案,即使在使用 MySQL 时,仓促的复制阅读器也会默认使用分析函数,我会很高兴。恕我直言,这是更好的默认情况。

以上是关于如何获取在 SQL 中具有重复列组合的记录? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

mysql - 为每组分组的 SQL 结果获取具有最大值的记录[重复]

SQL - 如何搜索具有不同列的双发生记录?

是否可以将 SELECT 语句中具有重复列值的记录与 SQL 中的另一条记录合并?

SQL 根据两列删除重复记录

如何将数据集拆分为两个具有唯一和重复行的数据集?

如何将数据集拆分为两个具有唯一和重复行的数据集?