2017-02-24 2 views
1

Ich habe Daten in meiner SQL-Datenbank, über Studenten und ihre Karten, die sie verwenden, um sich in System, manchmal Studenten enthalten verlieren ihre Karte und sie bekommen eine andere, aber die gleiche Zeile, die Informationen über Studentenkarte enthält wurde nicht aktualisiert, in der Tat neue Zeile wurde hinzugefügt, so dass wir Situation bekommen:Mehrere Zeilen, mit mehreren Werten, wie man höheren Wert für die gleiche Zeile ID

Es gibt einen Schüler mit 2 Karten und wie könnte Ich bestimme, welcher neuer ist, weil es keine Spalte über 'DateCreated' oder smth gibt ...

Ich finde auch heraus, wenn ich höhere CardId fo sehe r gleiche Schüler, , das bedeutet, dass ‚höhere‘ Zahl ist derzeit aktive Karte für Benutzer, so wie kann ich entfernen alte IDs ..

Hier ist das Foto: enter image description here

Danke Jungs, Prost

+0

Welche Version von SQL verwenden Sie? Dies ist wichtig zu wissen. –

+0

Bitte senden Sie Beispieldaten als formatierten Text anstelle von Bildern. (Ich kann den kleinen Text dieses Bildes nicht lesen.) – jarlh

+0

@TimBiegeleisen seine Microsoft SQL-Server –

Antwort

0

Ein Ansatz besteht darin, einen Lösch-Self-Join durchzuführen, wobei ein CTE verwendet wird, um die Datensätze zu identifizieren, die gelöscht werden sollen. Ein Datensatz sollte gelöscht werden, wenn a) er als ein Paar für ein gegebenes StudentID erscheint, und b) es das Minimum CardID für das StudentID ist.

WITH cte AS (
    SELECT StudentID, MIN(CardID) AS CardID 
    FROM yourTable 
    GROUP BY StudentID 
    HAVING COUNT(*) > 1  -- only do a delete if a pair be present 
) 
DELETE t1 
FROM yourTable t1 
INNER JOIN cte t2 
    ON t1.StudentID = t2.StudentID AND 
     t1.CardID = t2.CardID 
2

Sie könnten versuchen, diese

DELETE a 
FROM <your table name> a 
WHERE EXISTS 
       (SELECT 1 
       FROM <your table name> b 
       WHERE b.StudentId = a.StudentId 
       AND b.CardId > a.CardId) 

Diese Abfrage wird alle Schüler Datensätze löschen, die andere Datensätze vorhanden ist, die gleiche StudentID und den Wert von CardId größer als CardId von gelöschten Datensatz haben.

+0

Würde dies für alle Datenbanken funktionieren? Wir kennen die verwendete Datenbank nicht. –

+0

Wahrscheinlich tragbar, Kern ANSI SQL. – jarlh

+0

@Tim Biegeleisen seine Microsoft Sql Server –

0

Wenn Sie sicher sind, dass die höhere Karten-ID die gültige ist, können Sie den folgenden Trigger auf Ihrer Tabelle implementieren, der die alten Datensätze automatisch löscht, wenn Sie eine Zeile in die Tabelle einfügen.

Create Trigger delete_old_record 
On <Your_Table_Name> 
After Insert 
AS 

delete from <Your_Table_Name> where [Student ID]=(select [Student ID] from Inserted) 
and [Card_ID]<(select [Card_ID] from Inserted) 

Go 
Verwandte Themen