2017-02-07 7 views
0

SQLクエリの問題に関して助けが必要です。私は重複を削除することができるクエリを持っていますが、重複したデータのレコードをEventLogに削除する必要があります。以下は私のスチューデントテーブルの例です。下の表から、あなたは私がグループBにグループAからデータをコピーしていたようにのみアルファとブラボーが重複したデータのみをイベントログに挿入するには?

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

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

を重複している見ることができる、私は&以下はグループBで重複データを削除見つける必要が私のクエリですグループBから重複を削除するときに表示されます。

ここに私のイベントログの例と、実行するクエリをどのようにしたいのですか?

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

代わりのイベントログに、グループ全体Bのデータを挿入、単にイベントログに重複データを挿入することができます任意のクエリがありますか?

+0

使用しているdbmsにタグを付けます。 (そのコードは製品固有です。) – jarlh

答えて

0

上記の削除の前に実行してください。我々は、MicrosoftのSQLについて話している場合は、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 
+0

名前と年齢を使用して重複を決定します。名前と年齢の両方がまったく同じ場合、重複と見なされます。 –

0

に1が重複しているが、あなたは1としての非重複でそれらを一覧表示するにはROW_NUMBERを使用することができますし、どのような決定し、その後、すべてのものを挿入する方法がわかりません、キーは、出力句で、ここで詳細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 
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 
関連する問題