我需要SQL代码来识别表中可能存在的重复项。让我们说我的表有4列:
ID(主键)
日期1
日期2
的GroupID
(Date1,Date2,GroupID)形成一个唯一的密钥。
此表一次填充数据块,并且经常发生加载新块,其中包含已存在的许多记录。只要唯一键能够捕获它们就可以了。不幸的是,有时候第一次或后续上传时,Date1都是空的(或者至少是'1900/01/01')。
所以我需要的是确定(Date2,GroupID)组合出现多次的位置以及一个记录的位置Date1 ='1900/01/01'
由于
卡尔
答案 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手册中的条目以获取示例:
答案 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
,这在某些品牌的数据库上效果不佳。