SQL查找可能的重复项
我需要SQL代码来识别表中可能的重复项。假设我的表有4列:SQL查找可能的重复项,sql,duplicates,Sql,Duplicates,我需要SQL代码来识别表中可能的重复项。假设我的表有4列: ID(主键) 日期1 日期2 GroupID (Date1、Date2、GroupID)形成唯一键 这个表一次用数据块填充,并且经常会加载一个新的块,其中包含许多已经在其中的记录。这很好,只要唯一的钥匙抓住它们。不幸的是,有时Date1在第一次或后续上传时为空(或至少为“1900/01/01”) 因此,我需要的是确定(Date2,GroupID)组合在何处出现多次,以及记录Date1='1900/01/01'的one在何处出现 谢谢
- ID(主键)
- 日期1
- 日期2
- GroupID
卡尔也许是一个检查约束 类似于
选择count(*),其中date1='1900/01/01'和date2=@date2和groupid=@groupid
只需查看是否可以在表级约束中执行此操作。…除了在表上定义主键字段外,还可以添加其他唯一约束以执行所要求的相同类型的操作。它们将验证特定列或列集在表中是否具有唯一值 查看MySQL手册中的条目以获取示例:
您可以使用 使用此选项可标识主表中重复的记录:
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为空。您可能会遇到一个真实的情况,其中日期1在两行中不同,而(日期2,组ID)相同如果我理解正确,您正在寻找一组ID,其中组ID和日期2相同,有一次出现的日期1与1900/01/01不同,其余的日期1都是1900/01/01
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'
如果我没弄错的话,这里有个问题要问你:
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
)
希望这能有所帮助。bkm有点像,但内部select在某些数据库上的性能很差。 这更简单:
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')
这是我能想到的最直接的方法:
SELECT DISTINCT t1.*
FROM t t1 JOIN t t2 USING (date2, groupid)
WHERE t1.date1 = '1900/01/01';
无需使用
GROUP BY
,这在某些品牌的数据库中表现不佳。如果您有多个条目,其中Date1为1900/01/01,Date2和GROUP ID相同,是否视为多个条目?我猜是这样的…在这种情况下,这不会是一个问题-只有在一次上载中Date1是1900/01/01,但在另一次上载中有一个值时才会成为问题我的意思是如果您有多个条目,Date1是1900/01/01,Date2和GroupID相同,但一个Date1有值(具有相同的Date2和GroupID).不幸的是,我不得不考虑到可能没有关于Date1的信息
SELECT DISTINCT t1.*
FROM t t1 JOIN t t2 USING (date2, groupid)
WHERE t1.date1 = '1900/01/01';