2009-08-25 56 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,其中一些品牌數據庫的性能很差。