2017-02-07 2 views
0

Ich brauche Hilfe in Bezug auf ein SQL-Abfrageproblem. Ich habe eine Abfrage, wo ich die Duplikate löschen kann, aber ich muss auch Datensätze der duplizierten Daten erstellen, die in einem EventLog gelöscht werden, in dem ich keine Ahnung habe. Im Folgenden finden Sie ein Beispiel meiner Studententabelle. Aus der folgenden Tabelle können Sie sehen nur Alpha und BravoSo fügen Sie doppelte Daten nur in ein Ereignisprotokoll ein?

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

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

dupliziert sind, wie ich aus der Gruppe A zu Gruppe B Kopieren von Daten bin, muss ich & löschen die duplizierten Daten in der Gruppe finden Below B. meine Abfrage ist auf Duplikate aus der Gruppe 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') 

Hier ist ein Beispiel für meine eventlog und wie ich will die Abfrage zu löschen, die ich gerne ausführen.

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

Statt die gesamte Gruppe B Daten in das eventlog des Einsetzens, gibt es eine Abfrage, die die duplizierten Daten nur einfügen können in das Ereignisprotokoll?

+0

Markieren Sie die verwendeten DBMS. (Dieser Code ist produktspezifisch.) – jarlh

Antwort

0

Führen Sie dies vor dem Löschen oben aus. Nicht sicher, wie Sie sich entscheiden, was man das Duplikat ist, aber Sie können Row_Number nutzen sie mit dem nicht Duplikat zur Liste an als 1 und dann alles Einlegers mit 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

Ich verwende Name & Age, um über die Duplikate zu entscheiden. Wenn sowohl Name als auch Alter identisch sind, wird dies als Duplikat betrachtet. –

0

Wenn wir über Microsoft SQL sprechen, Schlüssel ausgegeben Klausel, mehr Details hier 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

Sie grundlegende Trigger nach dem Schüler Tabelle löschen, diese Abfrage nach jedem Löschvorgang in Schülertisch ausgeführt wird erstellen müssen und werden gelöscht Datensatz in log_table

einfügen
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 
Verwandte Themen