我对SQL非常陌生,所以我希望能解决一些问题。
我使用软件监控放在某些电脑上的文件,当写入文件时,记录会写入数据库,并在删除时再次写入。我想删除任何包含两个记录的记录。该表与下面的内容类似。
操作列在创建文件时显示0,在删除时显示1
datetime File hash value action
130213 14:33 | FDFGDFGDFGDFDFGVBVNVBNVBNVBNVNVBNVB | 0
130213 14:34 | FDFGDFGDFGDFDFGVBVNVBNVBNVBNVNVBNVB | 1
任何帮助将不胜感激。 小号
答案 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;
答案 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)
要查看哪些行将被删除,您可以使用子选择
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语句的目标。
该查询假定Action
是int
,且只能是0
或1
。如果是bit
,请将上面的Action
个条目替换为CAST(Action AS int)
。