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