首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何只将重复的数据插入事件日志?

如何只将重复的数据插入事件日志?
EN

Stack Overflow用户
提问于 2017-02-07 10:10:57
回答 3查看 48关注 0票数 0

我需要关于SQL查询问题的帮助。我有一个查询,在那里我可以删除重复的数据,但我也需要创建被删除的重复数据的记录到一个EventLog中,在这个EventLog中我是一无所知的。下面是我的学生表的一个例子。从下表中,您可以看到只有Alpha和Bravo是重复的。

代码语言:javascript
运行
复制
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组删除重复数据的查询。

代码语言:javascript
运行
复制
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')

下面是我的事件日志的一个例子,以及我希望执行的查询是如何执行的。

代码语言:javascript
运行
复制
id   Name   Age  Group Status
------------------------------------------
1    Alpha  11    B    Delete
2    Bravo  11    B    Delete

与将整个组B数据插入事件日志不同,是否有任何查询可以将复制的数据插入到事件日志中?

EN

回答 3

Stack Overflow用户

发布于 2017-02-07 10:17:27

在上面的删除之前运行此命令。不确定如何确定复制的内容,但可以使用Row_Number将其与不重复的as 1列出,然后插入row_Number >1的所有内容

代码语言:javascript
运行
复制
; 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
票数 0
EN

Stack Overflow用户

发布于 2017-02-07 10:26:25

如果我们讨论的是Microsoft sql,key is output子句,这里是https://msdn.microsoft.com/en-us/library/ms177564.aspx的更多细节。

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-02-07 14:00:27

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

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42087053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档