2016-08-04 19 views
1

Ich habe eine Tabelle mit 3 Spalten und die erste Spalte ist "Name". Einige Namen werden zweimal eingegeben, einige dreimal und einige mehr. Ich möchte nur einen Wert für jeden Namen behalten und die zusätzlichen Zeilen basierend auf den Werten von Spalte 2 und 3 löschen. Wenn Spalte 2 und 3 Null sind, möchte ich diese Zeile löschen. Es gibt keine Primärschlüssel oder ID-Spalte. Es gibt ungefähr 2,75 Millionen Zeilen in der Tabelle. Möchten Sie mit einer Abfrage löschen (vorzugsweise) in SQL 14. Kann jemand bitte helfen?Löschen von Duplikaten basierend auf dem Wert einer anderen Spalte

Name column2 column3 
Suzy english null 
Suzy null null 
Suzy null  5 
John null null 
John 7  7 
George null benson 
George null null 
George benson null  
George 5  benson 

Möchten sie haben, wie:

Name column2 column3 
Suzy english null 
Suzy null  5 
John  7  7 
George benson null 
George 5  benson  

Vielen Dank im Voraus.

+0

Wäre da nicht noch eine George-Reihe? Eine Reihe mit 'George, Benson, Null' und eine weitere Reihe mit' George, null, Benson' und die letzte mit '5, Benson'. – TTeeple

+0

Sie können auch überprüfen, wie Daten zur Tabelle hinzugefügt werden, damit Sie diese Bereinigung nicht erst vornehmen müssen? – bhs

Antwort

0

Verwenden Partitionen über Namen mit der entsprechenden Reihenfolge von löschen:

WITH cte as (
    SELECT ROW_NUMBER() 
    OVER (PARTITION BY name 
      ORDER BY case 
      when column1 = 'null' and column2 = 'null' then 3 
      when column2 = 'null' then 2 
      when column1 = 'null' then 1 
      else 0 end 
    ) num 
    FROM mytable 
) 
delete from cte where num > 1 

Dies löscht Dubletten, in der Reihenfolge der Präferenz zu halten, Reihen mit:

  1. sowohl column1 und column2 nicht null (gelegentlichen gehalten, wenn es mehrere davon ist)
  2. column1 nicht null
  3. column2 nicht null
  4. beide column1 und column2 null

Beachten Sie, dass Abfrage (basierend auf Kommentare zu hinterfragen) geht davon aus, dass Ihre „null“ Werte tatsächlich die Textzeichenfolge „null sind "und kein SQL null.

Wenn sie tatsächlich Nullen waren, ersetzen Sie = 'null' durch IS NULL.

+0

warum wir column2 = 'null', column1 = 'null' – TheGameiswar

+0

@thegame zu brechen Bindungen, Logik basierend auf Beispiel Daten in Frage. Siehe bearbeitete Antwort für weitere Details – Bohemian

+0

Danke @Bohemian. Es hat funktioniert wie ein Charme !! – Suzy

0
Delete from yourtable 
where column2 is null and column3 is null 

obige Abfrage wird auf dieser Basis ..

ich nur einen Wert für jeden Namen behalten möchten und die zusätzlichen Zeilen löschen basierend auf den Werten der Spalte 2 und 3. Wenn Spalte 2 und 3 sind null, würde Ich mag, dass Zeile

+0

Danke, aber das kleine Problem ist, wenn ich eine Suche nach * Wählen Sie aus Mistable wo Spalte2 ist Null und Spalte3 ist Null Es kommt mit nichts. aber wenn ich das tue Wählen * aus mytable Ich kann die 2 Nullspalten sehen !! Weiß nicht, wie man das Problem löst – Suzy

+2

Sind diese tatsächlichen 'NULL's oder die Zeichenkette" null "? Sie sind völlig unterschiedlich – TTeeple

+0

als @TTeeple sagte 'Null' unterscheidet sich von Null. – TheGameiswar

Verwandte Themen