删除两个类似的记录

时间:2013-02-13 10:23:45

标签: sql-server

我对SQL非常陌生,所以我希望能解决一些问题。

我使用软件监控放在某些电脑上的文件,当写入文件时,记录会写入数据库,并在删除时再次写入。我想删除任何包含两个记录的记录。该表与下面的内容类似。

操作列在创建文件时显示0,在删除时显示1

datetime       File hash value                       action
130213 14:33 | FDFGDFGDFGDFDFGVBVNVBNVBNVBNVNVBNVB | 0
130213 14:34 | FDFGDFGDFGDFDFGVBVNVBNVBNVBNVNVBNVB | 1

任何帮助将不胜感激。 小号

4 个答案:

答案 0 :(得分:1)

您可以使用联接来要求存在包含其他操作的记录:

delete  t1
from    Table1 t1
join    Table1 t2
on      t1.[File hash value] = t2.[File hash value]
        and t1.Action <> t2.Action;

要预览要删除的行,请将delete替换为select

select  t1.*
from    Table1 t1
join    Table1 t2
on      t1.[File hash value] = t2.[File hash value]
        and t1.Action <> t2.Action;

Example at SQL Fiddle.

答案 1 :(得分:0)

create table test (
    dt datetime,
    hv varchar(255),
    action int
)

insert into test values (getDate(), '123456', 0);
insert into test values (getDate(), '123456', 1);

delete a1 from test a1
join test a2 on a1.hv = a2.hv
where a1.action <> a2.action

答案 2 :(得分:0)

您可以在子选择中选择要删除的文件

delete from files
where file_hashes in (select file_hashes
                      from files
                      group by file_hashes
                      having count(file_hashes) = 2)

SQLFiddle

要查看哪些行将被删除,您可以使用子选择

select file_hashes
from files
group by file_hashes
having count(file_hashes) = 2

答案 3 :(得分:0)

如果您使用的是SQL Server 2005或更高版本,则可以尝试以下操作:

WITH marked AS (
  SELECT
    CanDelete =
      CASE MIN(Action) OVER (PARTITION BY FileHashValue)
      WHEN MAX(Action) OVER (PARTITION BY FileHashValue)
      THEN 0
      ELSE 1
      END
  FROM atable
)
DELETE FROM marked
WHERE CanDelete = 1
;

marked CTE检查每一行是否相应的FileHashValue的最小操作与最大操作相同。如果不是,则将该行标记为删除。

基于该属性,在主查询中删除行,其中CTE用作DELETE语句的目标。

该查询假定Actionint,且只能是01。如果是bit,请将上面的Action个条目替换为CAST(Action AS int)