1

我对 SQL 很陌生,所以想帮助我解决我遇到的问题。

我使用软件来监控放置在某些电脑上的文件,当一个文件被写入时,一条记录被写入数据库,当它被删除时再次写入。我想删除具有这两条记录的任何记录。该表与下表类似。

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

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

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

4

4 回答 4

1

您可以使用连接来要求有另一个操作的记录:

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

要预览将被删除的行,请替换deleteselect

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

SQL Fiddle 的示例。

于 2013-02-13T10:28:34.477 回答
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
;

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

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

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

于 2013-02-13T16:40:20.880 回答
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
于 2013-02-13T10:31:18.627 回答
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
于 2013-02-13T10:42:56.543 回答