2016-04-21 3 views
0

Ich möchte alle eindeutigen Datensätze im Dat1-Feld finden, aber ich möchte jeden einzelnen Null-Datensatz zurückgegeben. Es spielt keine Rolle, welcher doppelte Datensatz gelöscht wird.Suchen Sie nicht duplizierte Datensätze ohne Nullen basierend auf einem Feld.

Beispiel Tabelle:

+----+--------------+ 
| ID |  Dat1  | 
+----+--------------+ 
| 1 | [email protected] | 
| 2 | [email protected] | 
| 3 | NULL   | 
| 4 | NULL   | 
| 5 | [email protected] | 
| 6 | [email protected] | 
+----+--------------+ 

Gewünschtes Ergebnis:

+----+--------------+ 
| ID |  Dat1  | 
+----+--------------+ 
| 1 | [email protected] | 
| 3 | NULL   | 
| 4 | NULL   | 
| 5 | [email protected] | 
+----+--------------+ 

Ist das möglich? Ich habe ein paar Ansätze mit Unterabfragen versucht, konnte es aber nicht ganz durchziehen.

Antwort

0
select min(id), dat1 from table where dat1 is not null group by dat1 
union 
select id  , dat from table where dat1 is null 
0

können Sie ROW_NUMBER verwenden Duplikat für Nicht-Null-Dat1 s zu beseitigen und dann UNION ALL verwenden, um die NULL Werte hinzuzufügen:

WITH tbl(Id, Dat1) AS(
    SELECT 1, '[email protected]' UNION ALL 
    SELECT 2, '[email protected]' UNION ALL 
    SELECT 3, NULL UNION ALL 
    SELECT 4, NULL UNION ALL 
    SELECT 5, '[email protected]' UNION ALL 
    SELECT 6, '[email protected]' 
) 
SELECT 
    Id, Dat1 
FROM (
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY Dat1 ORDER BY Id) 
    FROM tbl 
    WHERE Dat1 IS NOT NULL 
)t 
WHERE rn = 1 

UNION ALL 

SELECT * FROM tbl WHERE Dat1 IS NULL