2010-10-22 7 views
0

Je souhaite obtenir des enregistrements redondants de la base de données. Ma requête est-elle correcte pour cela?Requête SQL pour obtenir un enregistrement redondant

select (fields) 
from DB 
group by name, city 
having count(*) > 1 

S'il y a un problème, veuillez me le faire savoir.

De plus, si je veux supprimer un enregistrement en double, cela fonctionnera-t-il?

delete from tbl_name 
where row_id in 
    (select row_id from tbl_name group by name, city having count(*) > 1) 

afin que je puisse faire la requête ci-dessus comme celui-ci

DELETE FROM tb_name where row_id not in(select min(row_id) from tb_name groupBy(name, city) having count(*)>1) 
+1

Vous devrez expliquer un peu mieux que cela. Quelle base de données utilisez-vous? –

+0

J'utilise sql server db. je veux aussi savoir comment puis-je faire requête pour obtenir l'enregistrement en double de DB – NoviceToDotNet

+0

que voulez-vous dire en double enregistrements .. Je veux dire que cette table a des enregistrements en double ou juste que vous voulez prendre un enregistrement en double? – kupa

Répondre

1

Votre syntaxe DELETE est définitivement totalement wron g - ça ne marchera jamais. Qu'est-ce qu'il va faire est de supprimer toutes les lignes qui ont plus d'une occurence - ne laissant aucune données autour ...

Qu'est-ce que vous pouvez faire dans SQL Server 2005 et jusqu'à utiliser est un CTE (Common Table Expression) et la fonction de classement ROW_NUMBER():

;WITH Duplicates AS 
(
    SELECT 
     Name, City, 
     ROW_NUMBER() OVER (PARTITION BY Name, City ORDER BY City) AS 'RowNum' 
) 
DELETE FROM dbo.YourTable 
WHERE RowNum > 1 

Vous créez essentiellement « partitions » de vos données par le combo (name, city) - chacune de ces paires obtiendrez des numéros séquentiels de 1 sur place.

Ceux qui ont plus d'une occurence auront aussi des entrées dans ce CTE avec un RowNum > 1 - il suffit de supprimer tout cela et vos doublons sont terminés!

En savoir plus sur Using Common Table Expressions in SQL Server 2005 et environ Ranking Functions and Performance in SQL Server 2005 (ou consultez la documentation MSDN sur ces sujets)

+0

donc je peux faire comme ça DELETE FROM tb_name où row_id n'est pas dedans (sélectionnez min (row_id) de tb_name groupBy (nom, ville) en comptant (*)> 1) – NoviceToDotNet

+0

@NoviceToDotNet: vous ne pouvez pas faire comme ça - vous devez utiliser l'approche CTE que j'ai montrée dans ma réponse - qui va supprimer les doublons de votre table –

1

Vous avez le mal de syntaxe:

select name, city, count(*) from table group by name, city having count(*) > 1 

Si vous n'êtes pas intéressé par le nombre réel, supprimer « , count(*) » de la requête

+0

comment puis-je faire une requête pour obtenir un enregistrement en double? – NoviceToDotNet

+0

Pourquoi avez-vous besoin d'une alternative? –

+0

je cherche une autre façon de le créer aussi – NoviceToDotNet

Questions connexes