2016-08-08 68 views
2

Ich habe eine Tabelle mit über 100k Datensätze. Hier ist mein Problem, ich habe eine Reihe von SäulenSQL Server 2008 wählen Abfrage Schwierigkeit

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 

Also hier ist, wie meine Tabelle sieht, hat es etwa 30 anderen Spalten, aber sie sind für diese Frage irrelevant.

Hier ist meine quandary..I'm versuchen, alle Datensätze zu wählen, in dem CompanyID und CompanyServiceID gleich sind, so dass im Grunde, wie Sie in der Tabelle oben sehen kann, ich habe Microsoft, die zweimal in der Tabelle angezeigt wird, und hat die gleiche CompanyID und , aber unterschiedlich ServiceTypeID.

Ich muss in der Lage sein, alle Datensätze zu durchsuchen, in denen Duplikate vorhanden sind. Die Person, die diese Daten pflegte, war sehr unordentlich und hat einige der Spalten nicht richtig aktualisiert, also muss ich durch alle Aufzeichnungen gehen und finden, wo es Aufzeichnungen gibt, die die gleichen CompanyID und CompanyServiceID haben.

Gibt es eine generische Abfrage, die das könnte?

Keine dieser Spalten meine Primärschlüssel sind, habe ich eine Spalte mit Datensatznummer, die in Schritten 1.

Antwort

2

Sie können so etwas wie dies versuchen:

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

Dies wird eine gruppierte Liste aller Unternehmen mit mehreren Einträgen zurück. Sie können die gewünschten Spalten in der SELECT-Anweisung ändern, wenn Sie weitere Informationen aus dem Datensatz benötigen.

+0

Danke, das hat super funktioniert! – BobSki

2

Hier ist eine Option row_number mit den Gruppierungen von duplizierten Daten zu erstellen:

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

Another 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 
1

Join Mit ..

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