如何仅将重复数据插入事件日志?

时间:2017-02-07 10:10:58

标签: c# sql asp.net

我需要有关SQL查询问题的帮助。我有一个查询,我可以删除重复项,但我还需要创建被删除的重复数据的记录到EventLog中,我对此无能为力。以下是我的学生表的示例。从下表中,您可以看到只有Alpha和Bravo重复

id   Name   Age  Group  
-----------------------
1    Alpha  11    A 
2    Bravo  12    A

3    Alpha  11    B      
4    Bravo  12    B
5    Delta  11    B  

当我将数据从A组复制到B组时,我需要找到&删除组B中的重复数据。以下是关于删除B组重复项的查询。

DELETE Student WHERE id 
IN (SELECT tb.id 
FROM Student AS ta 
JOIN Student AS tb ON ta.name=tb.name AND ta.age=tb.age 
WHERE ta.GroupName='A' AND tb.GroupName='B')

以下是我的事件日志的示例,以及我希望执行的查询的方式。

id   Name   Age  Group Status
------------------------------------------
1    Alpha  11    B    Delete
2    Bravo  11    B    Delete

有没有可以将重复数据插入事件日志的查询,而不是将整个B组数据插入到事件日志中?

3 个答案:

答案 0 :(得分:0)

在上面的删除之前运行此命令。不确定你如何决定副本是什么,但是你可以使用Row_Number将非重复列为1,然后使用row_Number>插入所有内容。 1

; WITH cte AS
(
    SELECT Name
          ,Age
          ,[Group]
          ,STATUS = 'Delete'
          ,RID = ROW_NUMBER ( )  OVER ( PARTITION BY Name,Age  ORDER BY Name)  
    FROM Student AS ta 
    JOIN Student AS tb ON ta.name=tb.name AND ta.age=tb.age         
)

    INSERT INTO EventLog
    SELECT Name,Age,[Group],'Delete'
    FROM cte
    WHERE RID > 1

答案 1 :(得分:0)

如果我们谈论的是Microsoft sql,key是输出子句,更多详细信息请https://msdn.microsoft.com/en-us/library/ms177564.aspx

declare @Student table
( id int, name nvarchar(20), age int,"groupname" char(1)) 

insert into @student values (1,  'Alpha' , 11,    'A' ),
(2,    'Bravo' , 12,    'A'),
(3    ,'Alpha' , 11 ,   'B'),      
(4    ,'Bravo'  ,12 ,   'B'),
(5    ,'Delta'  ,11 ,   'B')

declare @Event table
( id int, name nvarchar(20), age int,"groupname" char(1),"Status" nvarchar(20)) 


select * from @Student   

DELETE @Student 
output deleted.*, 'Deleted' into @Event
WHERE id 
IN (SELECT tb.id 
FROM @Student AS ta 
JOIN @Student AS tb ON ta.name=tb.name AND ta.age=tb.age 
WHERE ta.GroupName='A' AND tb.GroupName='B')

select * from @event

答案 2 :(得分:0)

你需要在学生表中删除后创建基本触发器,此查询将在学生表中的任何删除过程之后执行,并将删除的记录插入log_table

create trigger deleted_records 
  on student_table
  after delete
as
begin 
 insert into log_table  
 select d.id, d.Name, d.Age, d.Group, 'DELETED'
 from DELETED d;

end