SQL Server 2008 select la difficulté de requête

J'ai une table avec plus de 100k dossiers. Voici mon numéro, j'ai un tas de colonnes

CompanyID CompanyName CompanyServiceID ServiceTypeID Active ---------------------------------------------------------------- 1 Xerox 17 33 Yes 2 Microsoft 19 39 Yes 3 Oracle 22 54 Yes 2 Microsoft 19 36 Yes 

Voici à quoi ressemble ma table, il y a environ 30 autres colonnes, mais elles ne sont pas pertinentes pour cette question.

Voici mon dilemme … J'essaie de sélectionner tous les loggings où CompanyID et CompanyServiceID sont les mêmes, donc fondamentalement, comme vous pouvez le voir dans le tableau ci-dessus, j'ai Microsoft qui apparaît deux fois dans la table, et a le même CompanyID et CompanyServiceID , mais différent ServiceTypeID .

Je dois être capable de searchr tous les loggings où il y a des duplicates. La personne qui conservait ces données était très en désordre et n'a pas correctement mis à jour certaines des colonnes. Je dois donc passer en revue tous les loggings et find où se trouvent les loggings qui ont le même CompanyID et CompanyServiceID .

Y a-t-il une requête générique capable de faire cela?

Aucune de ces colonnes n'est ma key primaire, j'ai une colonne avec le numéro d'logging qui augmente de 1.

Vous pouvez essayer quelque chose comme ceci:

  SELECT CompanyName, COUNT(CompanyServiceID) FROM //table name here GROUP BY CompanyName HAVING ( COUNT(CompanyServiceID) > 1 ) 

Cela renverra une list groupée de toutes les entresockets avec plusieurs inputs. Vous pouvez modifier les colonnes que vous voulez dans l'instruction SELECT si vous avez également besoin d'autres informations de l'logging.

Voici une option utilisant row_number pour créer les regroupements de données dupliquées:

 select * from ( select *, row_number () over (partition by companyId, companyserviceid order by servicetypeid) rn from yourtable ) t where rn > 1 

Une autre option GROUP BY, HAVING and INNER JOIN

 SELECT * FROM Tbl A INNER JOIN ( SELECT CompanyID, CompanyServiceID FROM Tbl GROUP BY CompanyID, CompanyServiceID HAVING COUNT(1) > 1 ) B ON A.CompanyID = B.CompanyID AND A.CompanyServiceID = B.CompanyServiceID 

En utilisant Joindre ..

 Select * from Yourtable t1 join ( select companyid,companyserviceid,count(*) from Yourtable having count(*)>1)b on b.companyid=t1.companyid and b.companyserviceid=t1.companyserviceid