2009-06-19 67 views
0

考虑下面的表结构与数据 -需要选择查询

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

哪里AdjusterID是主键。没有。对公司的调整。

我需要有一个查询,它将列出每个公司的单个调节器。即我需要得到的结果为 -

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

如果任何人可以帮助我,那将是伟大的。

回答

2

方式一:

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

有涉及工会和迭代其他方式了一把,但是这是一个很简单,让你开始。

编辑:这里假设你想用最低的ID的调整,按照您的例子

+0

好极了! 它正在工作。 谢谢Jeremy – IrfanRaza 2009-06-19 06:55:00

0

我知道杰里米的答案是有效的,所以我就不再重复了。但你可以尝试另一个使用所谓的分频器:

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

它可能会更好的性能明智。但更有用的是,如果您在表格中添加了另一列,并且您希望为每个公司选择一个,而不是每个公司选择一个,但是使用其他列排名作为标准的每个公司不仅选择一个。因此,而不是ORDER BY AdjusterID,您可以通过其他列进行排序。

+0

这真的快吗?我没有执行计划查看器,但是我认为对于大型数据集,相关子查询会更慢一些? – 2009-06-19 10:02:10