代码之家  ›  专栏  ›  技术社区  ›  Karl

SQL查找可能的重复项

  •  2
  • Karl  · 技术社区  · 17 年前

    • ID(主键)

    • 日期2

    • 组ID

    (Date1、Date2、GroupID)形成一个唯一的密钥。

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

    因此,我需要的是一些东西来识别(Date2,GroupID)组合多次出现的位置以及 记录日期1='1900/01/01'

    谢谢

    7 回复  |  直到 17 年前
        1
  •  2
  •   SquareCog    17 年前

    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')
    
        2
  •  1
  •   bkm    17 年前

    您可以使用以下命令在(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)相同

        3
  •  1
  •   Roee Adler    17 年前

    如果我理解正确,您正在寻找一组ID,其中GroupID和Date2相同,Date1的一次出现与1900/01/01不同,其余的Date1都是1900/01/001。

    如果我没记错的话,这是给你的查询:

    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
    )
    

    希望这能有所帮助。

        4
  •  0
  •   Brent Writes Code    17 年前

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

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

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

        5
  •  0
  •   LRE    17 年前

    也许是一个检查约束。

    有些东西沿着线 select count(*) where date1 = '1900/01/01' and date2 = @date2 and groupid = @groupid

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

        6
  •  0
  •   wgpubs    17 年前
    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'
    
        7
  •  0
  •   Bill Karwin    17 年前

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

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

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