2009-06-19 7 views
0

concernant la structure de tableau ci-dessous avec des données -nécessaire de sélectionner la requête

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] 
============================================================ 

Où AdjusterID est la clé primaire. Il n'y a pas. d'experts pour une entreprise.

Je dois avoir une requête qui listera seul ajusteur par entreprise. dire que je dois obtenir le résultat que -

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

Si quelqu'un pouvait me aider qui sera grande.

Répondre

2

Une façon:

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

Il y a une poignée d'autres façons impliquant les syndicats et l'itération, mais celui-ci est assez simple pour vous aider à démarrer.

Edit: cela suppose que vous voulez le dispositif de réglage avec l'ID le plus bas, selon votre exemple

+0

C'est génial !!! Cela fonctionne. Merci Jeremy – IrfanRaza

0

Je sais que la réponse de Jeremy est valide, donc je ne vais pas le répéter. Mais vous pouvez en essayer un autre en utilisant ce que l'on appelle un tie-breaker:

--//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) 

Cela pourrait être une meilleure performance. Mais encore plus utile c'est si vous aviez une autre colonne dans le tableau et vous vouliez sélectionner non seulement un pour chaque entreprise mais le meilleur pour chaque entreprise en utilisant un autre classement de colonne comme critère. Donc, au lieu de ORDER BY AdjusterID, vous devez passer commande par cette autre colonne.

+0

Est-ce vraiment plus rapide? Je n'ai pas de visionneuse de plan d'exécution à portée de main, mais j'aurais pensé qu'une sous-requête corrélée serait plus lente, pour de grands ensembles de données? –

+0

@Jeremy. Si la performance n'est pas votre problème, ne vous embêtez pas à optimiser. Mais étant donné les bons indices, le tie-breaker devrait être plus rapide. Et cela devrait certainement être dans votre cas, comme c'est le cas sur le PK (qui, je suppose, est groupé). Vous devriez avoir un index sur CompanyID cependant pour les deux implémentation. --- Je n'ai pas de chiffres, mais il y a quelque temps, le tie-break a fonctionné pour moi lorsque la sous-requête s'est arrêtée. – van

Questions connexes