2009-08-25 57 views
2

我需要SQL代码来识别表中可能的重复项。比方说我的表有4列:SQL查找可能重复

  • ID(主键)

  • 日期1

  • 日期2

  • 群ID

(日期1,日期2, GroupID)形成一个唯一的密钥。

此表每次都会填充数据块,而且经常会发生这样的情况:装入的新块包含已存在的多个记录。这个罚款只要唯一的钥匙抓住他们。不幸的是,有时Date1是空的(或者至少'1900/01/01'),或者是第一次或后续上传。

所以我需要的是什么,以标识(日期2,组ID)组合多次出现,并在那里更多的记录一个日期1 =“1900年1月1日”

感谢

Karl

+0

如果您有多个条目,并且Date1为1900/01/01,并且Date2和GroupID相同,那么它是否被认为是多个?我猜想这是... – 2009-08-25 05:39:17

+0

在这种情况下,它不会是一个问题 - 只有当一个上传中的日期1为1900/01/01,但在另一个上载有值时才成为问题 – Karl 2009-08-25 05:49:22

+0

我的意思是如果您有多个条目Date1为1900/01/01,Date2和GroupID相同,但一个Date1确实具有值(具有相同的Date2和GroupID)。 – 2009-08-25 06:00:08

回答

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') 
+0

可能没有可用的信息,只需要选择DISTINCT t1。* ..... – Karl 2009-08-25 06:27:30

0

检查约束可能。

沿着select count(*) where date1 = '1900/01/01' and date2 = @date2 and groupid = @groupid的路线。

只需要看到,如果你能在表级约束做到这一点....

+0

对于一些示例代码,我认为这是答案。 – Cellfish 2009-08-25 05:30:37

1

可以使用

Select date2,GroupID 
from t 
group by (date2,GroupID) 
having count(*) >1 

使用此标识主记录标识上(DATE2,组ID)重复表是重复的:

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,组ID)是相同的

+0

不幸的是,我必须考虑到Date1 – Karl 2009-08-25 05:53:44

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' 
1

如果我理解正确,你正在寻找一个组ID为这组ID和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 
) 

希望有所帮助。

0

这是最简单的方法可以让我觉得这样做:

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

没必要用GROUP BY,其中一些品牌数据库的性能很差。