我有一个表,用户ID分为2列。 (为了解释这一点,我们通过扫描条形码来捕获参与者的ID。有时条形码扫描器功能因任何原因都不起作用,因此我们还允许手动输入ID,如果条形码扫描器不起作用。这导致如下数据:
+------+-----------+
| ID | ID_MANUAL |
+------+-----------+
| A | NULL |
| NULL | A |
| B | NULL |
| B | NULL |
| NULL | C |
| C | NULL |
| NULL | D |
| NULL | D |
+------+-----------+
我想找到所有重复的ID,同时考虑两列。很容易找到仅在1列(“B”和“D”)中的重复项。但是如何找到重复的“A”和“C”?理想情况下,查询将查找并返回所有重复项(A,B,C和D)。
谢谢!
答案 0 :(得分:1)
试试这个:
SELECT DUP.* FROM (SELECT ID FROM yourtable) ORI
LEFT JOIN yourtable DUP ON DUP.ID = ORI.ID_MANUAL WHERE DUP.ID IS NOT NULL
答案 1 :(得分:0)
建议:名为ID m的字段,唯一且不为空。但是如果你有这个结构,你可以试试这个:
SELECT id
FROM yourtable t
WHERE id is not null
AND
(SELECT COUNT(*)
FROM yourtable t2
WHERE t2.id = t.id) +
(SELECT COUNT(*)
FROM yourtable t3
WHERE t3.id_manual = t.id) > 1
UNION
SELECT id_manual
FROM yourtable t
WHERE id_manual is not null
AND
(SELECT COUNT(*)
FROM yourtable t2
WHERE t2.id = t.id_manual) +
(SELECT COUNT(*)
FROM yourtable t3
WHERE t3.id_manual = t.id_manual) > 1
您可以继续Sql Fiddle
答案 2 :(得分:0)
你可以在这里试试UNION ALL:
select id,count(*)
from
(
select id
from yourtable
union all
select id_manual as id
from yourtable
) a
group by id
having count(*) >1;
答案 3 :(得分:0)
尝试:
select id, count(*)
from
(
select id
from data
where id_manual is null
union all
select id_manual as id
from data
where id is null
) a
group by id
having count(*) > 1;
和
select id, id_manual
from data
group by id, id_manual
having count(*) > 1;
答案 4 :(得分:0)
如果您有代理自动增量主键,可以使用COALESCE和DISTINCT通过简单的JOIN执行此操作:
SELECT DISTINCT s2.pk, s2.ID, s2.ID_MANUAL
FROM scans s1
JOIN scans s2
ON COALESCE(s2.ID, s2.ID_MANUAL) = COALESCE(s1.ID, s1.ID_MANUAL)
AND s2.pk > s1.pk
这将排除原始记录,因此您可以删除此结果集中返回的记录。
这是SQL Fiddle。