我需要关于SQL查询问题的帮助。我有一个查询,在那里我可以删除重复的数据,但我也需要创建被删除的重复数据的记录到一个EventLog中,在这个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数据插入事件日志不同,是否有任何查询可以将复制的数据插入到事件日志中?
发布于 2017-02-07 10:17:27
在上面的删除之前运行此命令。不确定如何确定复制的内容,但可以使用Row_Number将其与不重复的as 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
发布于 2017-02-07 10:26:25
如果我们讨论的是Microsoft sql,key is output子句,这里是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
发布于 2017-02-07 14:00:27
您需要在学生表中删除后创建基本触发器,此查询将在学生表中的任何删除过程之后执行,并将已删除的记录插入到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
https://stackoverflow.com/questions/42087053
复制相似问题