【问题标题】:How can I get records that have a duplicate combination of columns in SQL? [duplicate]如何获取在 SQL 中具有重复列组合的记录? [复制]
【发布时间】: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 |
+----+----------+-------------------------+ 

【问题讨论】:

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

标签: sql


【解决方案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 时,仓促的复制阅读器也会默认使用分析函数,我会很高兴。恕我直言,这是更好的默认情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    相关资源
    最近更新 更多