2010-12-30 5 views
5

J'ai une table qui contient malheureusement de mauvaises données et j'essaie de filtrer un peu. Je suis sûr que la combinaison LName, FName est unique car l'ensemble de données est suffisamment petit pour être vérifié.SQL Supprimer presque les lignes en double

LName, FName, Email 
----- ----- ----- 
Smith Bob [email protected] 
Smith Bob NULL 
Doe Jane NULL 
White Don [email protected] 

Je voudrais avoir les résultats de la requête ramener le dossier « double » qui ne dispose pas d'un e-mail NULL, mais encore apporter de nouveau un e-mail NULL quand il n'y a pas un doublon.

E.g.

Smith Bob [email protected] 
Doe Jane NULL 
White Don [email protected] 

Je pense que la solution est similaire à Sql, remove duplicate rows by value, mais je ne comprends pas vraiment si les exigences du Asker sont les mêmes que les miennes.

Des suggestions?

Merci

+0

Merci pour les solutions de Cybernate et Michael Goldshteyn. Je suis allé avec FooLman b/c c'était la première solution qui a fait le travail. Intéressant de voir les différentes méthodes de résolution. – jimueller

Répondre

7

Cette chute les lignes nulles s'il y a des valeurs non nulles.

SELECT lname 
     , fname 
     , MIN(email) 
FROM YourTable 
GROUP BY 
     lname 
     , fname 

script Test

DECLARE @Test TABLE (
    LName VARCHAR(32) 
    , FName VARCHAR(32) 
    , Email VARCHAR(32) 
) 

INSERT INTO @Test 
    SELECT 'Smith', 'Bob', '[email protected]' 
    UNION ALL SELECT 'Smith', 'Bob', 'NULL' 
    UNION ALL SELECT 'Doe', 'Jane', 'NULL' 
    UNION ALL SELECT 'White', 'Don', '[email protected]' 

SELECT lname 
     , fname 
     , MIN(Email)   
FROM @Test 
GROUP BY 
     lname 
     , fname 
+1

+1 Ceci est de loin la solution * la plus facile * postée qui fait ce qui est demandé. La communauté semble souffrir de surengagement . –

+0

@Lieven - Ça ne marchera pas! Où est-il logique de garder les lignes nulles s'il n'y en a pas de non nulles? –

+0

@Martin, la requête produit la sortie demandée par op pour des entrées données n'est-ce pas (ou est-ce que j'ai gaffé à nouveau)? –

3

Voici une requête relativement simple qui utilise SQL standard et ne ceci:

SELECT * FROM Person P 
WHERE Email IS NOT NULL OR -- Take all people with non-null e-mails 
     Email IS NULL AND -- and all people with null e-mails, as long as 
     NOT EXISTS   -- there is no duplicate record of the same person 
      (SELECT *  -- with a non-null e-mail 
      FROM Person P2 
      WHERE P2.LName=P.LName AND P2.FName=P.FName AND P2.Email IS NOT NULL) 
+0

Voulez-vous dire que 'row_number' n'est pas un code SQL standard? –

+0

Je n'insinue rien - je propose simplement une solution simple qui n'utilise rien de plus qu'une requête SQL standard impliquant un sous-select. Mais, si vous voulez la réponse à votre question concernant ROW_NUMBER, non ce n'est pas SQL standard et PARTITION BY non plus. –

+0

ANSI SQL 1999 [selon ici] (http://ss64.com/ora/syntax-analytic.html) Ce SQL standard n'a jamais été spécifié par l'OP de toute façon. –

7

Vous pouvez utiliser ROW_NUMBER() fonction analytique:

SELECT * 
    FROM (
       SELECT a.*, ROW_NUMBER() OVER(PARTITION BY LName, FName ORDER BY Email DESC) rnk 
        FROM <YOUR_TABLE> a 
       ) a 
WHERE RNK = 1 
+0

+1 Cela sera probablement plus efficace qu'une auto-jointure. Cette technique peut être utilisée pour supprimer ainsi que par ma réponse. –

1

Étant donné que de nombreuses solutions SQL sont déjà publiées, vous pouvez créer un correctif de données pour supprimer les données incorrectes, puis ajouter les contraintes nécessaires pour empêcher l'insertion de données incorrectes. Les données incorrectes dans une base de données sont un effet secondaire d'une mauvaise conception.

+0

Je suis d'accord et je comprends, mais je ne peux pas faire grand-chose à ce sujet dans le domaine informatique d'entreprise. C'est la réalité des données avec lesquelles je dois travailler. – jimueller

+0

@ jrm82, il est d'autant plus important de corriger de telles choses dans les applications d'entreprise! Juste parce que c'est apin ne signifie pas que vous ne devriez pas le faire. Cela ne causera pas de fin de problèmes pour toujours si vous ne corrigez pas. – HLGEM

+0

HLGEM - Je ne possède pas les données et je n'ai pas la capacité de travailler sur ce que je veux. – jimueller

Questions connexes