SQL查找可能的重复项

时间:2009-08-25 05:21:21

标签: sql duplicates

我需要SQL代码来识别表中可能存在的重复项。让我们说我的表有4列:

  • ID(主键)

  • 日期1

  • 日期2

  • 的GroupID

(Date1,Date2,GroupID)形成一个唯一的密钥。

此表一次填充数据块,并且经常发生加载新块,其中包含已存在的许多记录。只要唯一键能够捕获它们就可以了。不幸的是,有时候第一次或后续上传时,Date1都是空的(或者至少是'1900/01/01')。

所以我需要的是确定(Date2,GroupID)组合出现多次的位置以及一个记录的位置Date1 ='1900/01/01'

由于

卡尔

7 个答案:

答案 0 :(得分:2)

bkm有种类,但内部选择在某些数据库上表现不佳。 这更直截了当:

select t1.* from 
t as t1 left join t as t2 
on (t1.date2=t2.date2 and t1.groupid=t2.groupid)
where t1.id != t2.id and (t1.date1='1900/01/01' or t2.date2='1900/01/01')

答案 1 :(得分:1)

您可以使用

在(date2,GroupID)上识别重复项
Select date2,GroupID
from t
group by (date2,GroupID)
having count(*) >1

使用它来识别主表中重复的记录:

Select *
from t
where date1='1900/01/01'
and (date2,groupID) = (Select date2,GroupID
                       from t
                       group by (date2,GroupID)
                       having count(*) >1)

注意:由于Date1,Date2,GroupID形成唯一键,请检查您的设计是否正确,允许Date1为NULL。你可以有一个真实的情况,其中日期1对于两行是不同的,而(date2,GroupID)是相同的

答案 2 :(得分:1)

如果我理解正确,你正在寻找一组ID,其中GroupID和Date2是相同的,有一个出现的Date1与1900/01/01不同,而其余的所有Date1都是1900/01 / 01。

如果我说得对,那么这就是你的问题:

SELECT T.ID 
FROM Table T1
WHERE 

(T1.GroupID, T1.Date2) IN
    (SELECT T2.GroupID, T2.Date2
    WHERE T2.Date1 = '1900/01/01' OR
        T2.Date IS NULL
    GROUP BY T2.GroupID, T2.Date2)

AND 

1 >= 
(
    SELECT COUNT(*) 
    FROM TABLE T3
    WHERE NOT (T3.Date1 = '1900/01/01') 
    AND NOT (T3.Date1 IS NULL)
    AND T3.GroupID = T1.GroupID
    AND T3.Date2 = T1.Date2
)

希望有所帮助。

答案 3 :(得分:0)

也许是一个检查约束。

select count(*) where date1 = '1900/01/01' and date2 = @date2 and groupid = @groupid

的某些内容

只需要看看你是否可以在表级约束中执行此操作....

答案 4 :(得分:0)

除了在表上定义了PRIMARY KEY字段之外,您还可以添加其他UNIQUE约束来执行您要求的相同类型的操作。他们将验证特定列或列集在表中是否具有唯一值。

查看MySQL手册中的条目以获取示例:

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

答案 5 :(得分:0)

select * from table a
join (
select Date2, GroupID, Count(*)
from table
group by Date2, GroupID
having count(*) > 1
) b on (a.Date2 = b.Date2 and a.GroupID = b.GroupID)
where a.Date1 = '1900/01/01'

答案 6 :(得分:0)

这是我能想到的最直接的方式:

SELECT DISTINCT t1.*
FROM t t1 JOIN t t2 USING (date2, groupid)
WHERE t1.date1 = '1900/01/01';

无需使用GROUP BY,这在某些品牌的数据库上效果不佳。