2016-03-25 10 views
1

Aus einer Auswahlabfrage ich das Ergebnis etwas wie dieses:Sie erhalten keine duplizierten Datensatz auf SQL

IdCompany | IdUser | ComapnyName | JobTitle 
1   100  Company1  Developer 
2   100  Company2  Developer 
3   200  Company3  Developer 
4   200  Company4  Developer 
5   200  Company5  Developer 
6   300  Company6  Developer 

Was ich will, ist die gleiche Felder, aber nicht den duplizierten IdUser zu bekommen, für jeden IdUser zu erhalten nur ein Rekord. Ich versuchte es mit DISTINCT und EXISTS, konnte aber keine Lösung finden. Diese ist die Art, wie ich mein Ergebnis sein wollen:

IdCompany | IdUser | ComapnyName | JobTitle 
1   100  Company1  Developer 
5   200  Company5  Developer 
6   300  Company6  Developer 
+2

Welche DBMS verwenden Sie? –

+0

DISTINCT macht den Job gehorsam, weil die IdCompany nicht in jeder Zeile Unique ist, versuche den ** GROUP BY ** Befehl –

Antwort

1

Ein typischer Weg, dies zu tun, die ANSI-Standard-Fensterfunktion verwendet row_number():

select t.* 
from (select t.*, row_number() over (partition by idUser order by idUser) as seqnum 
     from t 
    ) t 
where seqnum = 1; 
+0

es funktioniert, danke – user3116539

0

Sie könnten versuchen, diese:

select * from TABLE group by ´IdCompany´ 
+1

GROUP BY CompanyName (nicht IdCompany) zu suchen und vergesse nicht, dass die Reihenfolge der Anzeige von COLUMNS auch Auswirkungen hat GROUP BY –

1

Dies sollte den Job vorausgesetzt, dass IdCompany ein PK oder zumindest deutliche

select * from table 
where IdComapny in 
(select min(IdCompany) from table 
group by IdUser) 
0

Ich denke, Ihre Anforderung könnte falsch sein. Aber diese Abfrage ist sehr nah an Ihren Ergebnissen. Bitte platzieren Sie Ihre Tabelle in unter Abfrage

select * from 
    (
     select rn = ROW_NUMBER() over (partition by IdUser order by IdUser) , 
       * 
     from YourTable 
    ) B 
where rn = 1