【问题标题】:SQL show duplicates after join加入后 SQL 显示重复项
【发布时间】:2017-01-31 14:42:42
【问题描述】:

我正在尝试选择表的所有重复(删除不同记录)条目,即联接的结果。

我正在尝试这样做:

SELECT items.id, b.title FROM b WHERE b.title IN (
SELECT b.title FROM b LIMIT 20 GROUP BY b.title HAVING COUNT(*)>1
) INNER JOIN items USING (number) 

注意:number 是用于连接的“items”和“b”表共有的索引。

但显然这行不通。我正在尝试了解如何获取重复项并返回连接结果。

输出示例应该是:

 id | title
----|----
001 | House
002 | House
005 | Tree
010 | Tree
006 | Car
007 | Car

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 为什么要限制?
  • MySql 和 LIMIT 仅用于调试,20 是一个很好的数字,可以让一些重复项进行测试
  • 您的查询甚至不应该解析

标签: mysql sql join duplicates


【解决方案1】:

在子查询中使用COUNT(*) 会产生开销。我建议:

SELECT i.id, b.title
FROM b JOIN
     items i
     USING (number)
WHERE EXISTS (SELECT 1
              FROM b b2
              WHERE b2.title = b.title AND b2.id <> b.id
             );

这确实假设b 在每一行上都有一个唯一的 id,用于子查询。此查询可以使用b(title, id) 上的索引。

【讨论】:

  • 非常感谢,第一部分很清楚,第二部分有点难以理解。这很好地解释了如何选择正确的元素
【解决方案2】:

你可以这样做:

SELECT id, title
FROM b INNER JOIN items USING number
WHERE title IN 
    (SELECT title
     FROM b
     GROUP BY title
     HAVING COUNT(*) > 1)

【讨论】:

    【解决方案3】:

    我已经使用类似的查询完成了几次类似的事情。

    SELECT id
           ,title
      FROM some_table AS T1
     WHERE (SELECT COUNT(1)
              FROM some_table AS T2
             WHERE T1.title = T2.title) > 1
    

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      相关资源
      最近更新 更多