查找指定列的重复行

32 浏览
0 Comments

查找指定列的重复行

这个问题已经有了答案:

如何在 SQL 表中查找重复的值

我有如下数据,需要找出具有相同值的 ID(值的个数也应相同)。

这里的 1 和 3 具有相同的值但 ID 不同,因此我希望输出这两个 ID。

ID 为 4 的记录也具有相同的链接,但它也具有不同的值 333,所以我不需要它。

id  value
1   111
1   222
2   222
2   333
3   111
3   222
4   111
4   222
4   333
5       111
5       444

我尝试使用 EXISTS 查询,但它也返回了错误的记录 5。我正在使用 Oracle 11G 模式。

期望的输出是:

给相同的 ID 分配一个数字以便识别重复的记录。

因此,对于以下数据:

1 111 1

1 222 1

3 111 1

3 111 1

admin 更改状态以发布 2023年5月25日
0
0 Comments

如果只有所有值都匹配的ID是感兴趣的部分,一种方法是检查每个ID有多少个值,然后匹配那些具有相同计数的值并检查匹配了多少个值

With R AS (
  SELECT id, Count(1) Dim
  FROM   Table1
  GROUP BY id
)
SELECT r1.id id_1, r2.id id_2
FROM   R r1
       INNER JOIN R r2 ON r1.dim = r2.dim
       INNER JOIN Table1 t1 ON r1.id = t1.id
       INNER JOIN Table1 t2 ON r2.id = t2.id AND t1.value = t2.value 
              AND t2.id > t1.id
GROUP BY r1.id, r2.id
HAVING COUNT(1) = MAX(r1.dim);

t2.id > t1.id条件是避免重复出现的配对

要获得与问题中类似的结果集,可以将上一个查询用作基础再次使用JOIN与表连接

With R AS (
  SELECT id, Count(1) Dim
  FROM   Table1
  GROUP BY id
), M AS (
  SELECT r1.id id_1, r2.id id_2
  FROM   R r1
         INNER JOIN R r2 ON r1.dim = r2.dim
         INNER JOIN Table1 t1 ON r1.id = t1.id
         INNER JOIN Table1 t2 ON r2.id = t2.id AND t1.value = t2.value 
                AND t2.id > t1.id
  GROUP BY r1.id, r2.id
  HAVING COUNT(1) = MAX(r1.dim)
)
SELECT t1.id id_1, t1.value value_1, t1.id base_value
     , t2.id id_2, t2.value value_2, t1.id base_value_2
FROM   M
       INNER JOIN Table1 t1 ON m.id_1 = t1.id
       INNER JOIN Table1 t2 ON m.id_2 = t2.id AND t1.value = t2.value

SQLFiddle演示包含两个查询

即使演示是在SQLServer 2012中进行的,这些查询也仅使用标准命令编写

如果OP使用MySQL,则WITH中的部分需要转换为FROM子句中的子查询

0
0 Comments

你需要使用SET操作。测试集合相等的一种方法是:A减去B等于B减去A等于空集。

以下是如何使用PL/SQL实现的。

DECLARE
  v_count_1 number;
  v_count_2 number;
BEGIN
  FOR r IN (SELECT DISTINCT id FROM my_table) LOOP
    FOR r_inner in (SELECT DISTINCT id FROM my_table WHERE id > r.id) LOOP
      SELECT count(*)
      INTO v_count_1
      FROM (SELECT value FROM my_table WHERE id = r.id
            MINUS
            SELECT value FROM my_table WHERE id = r_inner.id);
      SELECT count(*)
      INTO v_count_2
      FROM (SELECT value FROM my_table WHERE id = r_inner.id
            MINUS
            SELECT value FROM my_table WHERE id = r.id);
      IF v_count_1 = 0 AND v_count_2 = 0 THEN
        dbms_output.put_line('duplicate IDs: '||r.id||' '||r_inner.id);
      END IF;
    END LOOP;
  END LOOP;
END;
/

0