Pouvez-vous m'aider avec les instructions SQL à trouver des doublons sur plusieurs champs?
Par exemple, en pseudo-code:
select count(field1,field2,field3)
from table
where the combination of field1, field2, field3 occurs multiple times
et à partir de la déclaration ci-dessus s'il y a plusieurs occurrences j'aimerais sélectionner tous les enregistrements sauf le premier .
Pour obtenir la liste des champs pour lesquels il existe plusieurs enregistrements, vous pouvez utiliser ..
select field1,field2,field3, count(*)
from table_name
group by field1,field2,field3
having count(*) > 1
Vérifiez ce lien pour plus d'informations sur la suppression des lignes.
http://support.Microsoft.com/kb/139444
Edit: Comme les autres utilisateurs mentionnés, il devrait y avoir un critère pour décider comment vous définissez les "premières lignes" avant d'utiliser l'approche dans le lien ci-dessus. Sur cette base, vous devrez utiliser une clause order by et une requête secondaire si nécessaire. Si vous pouviez publier des exemples de données, cela aiderait vraiment.
Vous mentionnez "le premier", donc je suppose que vous avez une sorte de commande sur vos données. Supposons que vos données sont classées par un champ ID
.
Ce code SQL devrait vous fournir les entrées en double, à l’exception de la première. Il sélectionne fondamentalement toutes les lignes pour lesquelles une autre ligne avec (a) les mêmes champs et (b) un ID inférieur existe. Les performances ne seront pas excellentes, mais cela pourrait résoudre votre problème.
SELECT A.ID, A.field1, A.field2, A.field3
FROM myTable A
WHERE EXISTS (SELECT B.ID
FROM myTable B
WHERE B.field1 = A.field1
AND B.field2 = A.field2
AND B.field3 = A.field3
AND B.ID < A.ID)
C’est une solution amusante avec SQL Server 2005 que j’aime bien. Je vais supposer que par "pour chaque enregistrement sauf le premier", vous voulez dire qu'il existe une autre colonne "id" que nous pouvons utiliser pour identifier quelle ligne est "première".
SELECT id
, field1
, field2
, field3
FROM
(
SELECT id
, field1
, field2
, field3
, RANK() OVER (PARTITION BY field1, field2, field3 ORDER BY id ASC) AS [rank]
FROM table_name
) a
WHERE [rank] > 1
Pour voir la valeur en double
with MYCTE as (
select row_number() over ( partition by name order by name) rown, * from tmptest
)
select * from MYCTE where rown <=1
Si vous utilisez SQL Server 2005 ou une version ultérieure (et que les balises de votre question indiquent SQL Server 2008), vous pouvez utiliser des fonctions de classement pour renvoyer les enregistrements en double après le premier, si l'utilisation de jointures est moins souhaitable ou peu pratique pour une raison quelconque. L'exemple suivant montre cela en action, où il fonctionne également avec des valeurs NULL dans les colonnes examinées.
create table Table1 (
Field1 int,
Field2 int,
Field3 int,
Field4 int
)
insert Table1
values (1,1,1,1)
, (1,1,1,2)
, (1,1,1,3)
, (2,2,2,1)
, (3,3,3,1)
, (3,3,3,2)
, (null, null, 2, 1)
, (null, null, 2, 3)
select *
from (select Field1
, Field2
, Field3
, Field4
, row_number() over (partition by Field1
, Field2
, Field3
order by Field4) as occurrence
from Table1) x
where occurrence > 1
Après avoir exécuté cet exemple, notez que le premier enregistrement de chaque "groupe" est exclu et que les enregistrements avec des valeurs NULL sont gérés correctement.
Si vous ne disposez pas d'une colonne pour ordonner les enregistrements d'un groupe, vous pouvez utiliser les colonnes partition par partition comme colonnes Order-by.
CREATE TABLE #tmp
(
sizeId Varchar(MAX)
)
INSERT #tmp
VALUES ('44'),
('44,45,46'),
('44,45,46'),
('44,45,46'),
('44,45,46'),
('44,45,46'),
('44,45,46')
SELECT * FROM #tmp
DECLARE @SqlStr VARCHAR(MAX)
SELECT @SqlStr = STUFF((SELECT ',' + sizeId
FROM #tmp
ORDER BY sizeId
FOR XML PATH('')), 1, 1, '')
SELECT TOP 1 * FROM (
select items, count(*)AS Occurrence
FROM dbo.Split(@SqlStr,',')
group by items
having count(*) > 1
)K
ORDER BY K.Occurrence DESC
essayez cette requête pour avoir le compte sepratley de chaque instruction SELECT:
select field1,count(field1) as field1Count,field2,count(field2) as field2Counts,field3, count(field3) as field3Counts
from table_name
group by field1,field2,field3
having count(*) > 1