我需要有关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组数据插入到事件日志中?
答案 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