2016-04-13 12 views
-4

Ich habe diese Situation:Zeilen löschen in einer Gruppe mit Ausnahme einer von ihnen SQL

enter image description here

ich einer der deutlichen Zeile löschen müssen, ich meine, brauchen nur eine „1, 1, 1, "und nur eines von" 2, 2, 2 "in einem CTE auf SQL, aber wie Sie sehen können, kann ich kein distinct verwenden.

+0

** SELECT DISTINCT ... '** – lad2025

+0

eine Kopie Tabelle Machen, fügen Sie in Kopie ein, die sich von Originaltabelle unterscheidet. – jarlh

+1

Welche DBMS verwenden Sie? – jarlh

Antwort

2
WITH t AS 
     (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY col1, col2, col3) ORDER BY (id) rn 
     FROM mytable 
     ) 
DELETE 
FROM t 
WHERE rn > 1 
+0

Frage bearbeitet und aktualisiert. –

+0

@SebastianPelaez: Die Antwort funktioniert immer noch. Es würde sehr helfen, wenn wir Ihr tatsächliches Tabellenlayout sehen würden (es sei denn, Sie haben wirklich alle Ihre Spalten benannt "(Kein Spaltenname)") – Quassnoi

1

ich einfach etwas vorschlagen kann:

CREATE TABLE tmp_table AS 
SELECT DISTINCT col1,col2,col3 FROM YourTable; 

DELETE FROM YourTable; 

INSERT INTO YourTable 
SELECT * FROM tmp_table; 

DROP TABLE tmp_table; 

Dies wird grundsätzlich Ihre Tabelle mit unterschiedlichen Werten neu erstellt eine temporäre Tabelle verwenden.

Hinweis: Es gibt effizientere Möglichkeiten, dies zu tun, aber Sie haben Ihr DBMS nicht angegeben, und es kann von einem zum anderen wechseln. Diese Lösung ist für ANSI SQL

0
;with cte_del as 
(
select *,row_number() over (partition by col1,col2,col3 order by col1,col2,col3) as rownum from yourtable 
) 
delete from cte_del where rownum > 1 

Gut, wenn Sie mehr über Row_Number() lesen, Rank(), DENSERANK()