2

我需要能够识别表中可能重复的 SQL 代码。假设我的表有 4 列:

  • ID(主键)

  • 日期1

  • 日期2

  • 组ID

(Date1, Date2, GroupID) 形成一个唯一键。

该表一次填充数据块,并且经常会加载一个新块,其中包含许多已经存在的记录。这很好,只要唯一的钥匙抓住他们。不幸的是,有时 Date1 是空的(或至少是“1900/01/01”),无论是第一次上传还是后续上传。

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

谢谢

卡尔

4

7 回答 7

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')
于 2009-08-25T05:33:14.473 回答
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) 相同

于 2009-08-25T05:28:16.573 回答
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
)

希望有帮助。

于 2009-08-25T05:33:01.930 回答
0

也许是一个检查约束。

类似的东西select count(*) where date1 = '1900/01/01' and date2 = @date2 and groupid = @groupid

只需要看看你是否可以在表级约束中做到这一点......

于 2009-08-25T05:24:38.360 回答
0

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

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

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

于 2009-08-25T05:27:32.347 回答
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'
于 2009-08-25T05:32:28.640 回答
0

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

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

不需要使用GROUP BY,在某些品牌的数据库上表现不佳。

于 2009-08-25T05:42:25.203 回答