我有下面的数据,我需要找到具有相同值的ID(值的数量也应该相同)。 这里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
答案 0 :(得分:0)
您需要SET操作。测试集合相等性的一个想法是:A减B等于B减去等于空的集。
以下是使用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;
/
答案 1 :(得分:0)
如果只有匹配彼此所有值的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
两个查询的
即使演示在SQLServer 2012中,查询也只使用标准命令编写。
如果OP使用MySQL,WITH
中的部分需要转换为FROM
子句中的子查询。