2009-06-19 4 views
0

Betrachten Sie die folgende Tabellenstruktur mit Daten -Benötigen Abfrage wählen

AdjusterID | CompanyID | FirstName | LastName | EmailID 
============================================================ 
1001  | Sterling | Jane  | Stewart | [email protected] 
1002  | Sterling | David  | Boon  | [email protected] 
1003  | PHH   | Irfan  | Ahmed | [email protected] 
1004  | PHH   | Rahul  | Khanna | [email protected] 
============================================================ 

Wo AdjusterID der Primärschlüssel ist. Es gibt keine. von Adjustern für eine Firma.

Ich brauche eine Abfrage, die einzelne Einsteller pro Unternehmen auflisten wird. das heißt ich brauche als das Ergebnis zu erhalten -

======================================================== 
1001 | Sterling | Jane | Stewart | [email protected] 
1003 | PHH  | Irfan | Ahmed | [email protected] 
======================================================== 

Wenn jemand mir helfen kann, das wird groß sein.

Antwort

2

One way:

SELECT * FROM Adjusters 
WHERE AdjusterID IN(SELECT min(AdjusterID) 
        FROM Adjusters GROUP BY CompanyID) 

Es gibt eine Handvoll andere Möglichkeiten Gewerkschaften und Iteration beteiligt, aber dieses ist einfach genug, um Ihnen den Einstieg.

Edit: Dies vorausgesetzt, dass Sie den Regler mit der niedrigsten ID wollen, wie pro Ihr Beispiel

+0

Das ist großartig !!! Es funktioniert. Danke Jeremy – IrfanRaza

0

Ich weiß die Antwort von Jeremy gültig ist, also werde ich es nicht wiederholen. Aber Sie können einen anderen mit einem sogenannten Tie-Breaker versuchen:

--//using a tie-breaker. Should be very fast on the PK field 
--// but it would be good to have an index on CompanyID 
SELECT t.* 
FROM MyTable t 
WHERE t.AdjusterID = (SELECT TOP 1 x.AdjusterID FROM MyTable x WHERE x.CompanyID = t.CompanyID ORDER BY AdjusterID) 

Es könnte besser sein, Leistung-weise. Aber noch nützlicher ist es, wenn Sie eine andere Spalte in der Tabelle hatten und Sie wollten nicht nur eine für jede Firma auswählen, sondern die beste für jede Firma, die eine andere Spalte als Kriterium verwendet. Also, anstatt ORDER BY AdjusterID, würden Sie durch diese anderen Spalte (n) bestellen.

+0

Ist das wirklich schneller? Ich habe keinen Ausführungsplan-Viewer zur Hand, aber ich hätte gedacht, dass eine korrelierte Unterabfrage für große Datasets langsamer wäre. –

+0

@ Jeremy. Wenn die Leistung nicht Ihr Problem ist, kümmern Sie sich nicht um die Optimierung. Aber bei richtigen Indizes sollte der Tie-Breaker schneller sein. Und es sollte definitiv in Ihrem Fall sein, wie es auf der PK ist (die ich denke, ist gruppiert). Sie sollten jedoch einen Index für CompanyID für beide Implementierungen haben. --- Ich habe keine Nummern, aber vor einiger Zeit funktionierte der Tie-Breaker für mich, wenn die Sub-Query einfach hängen blieb. – van