问题描述如下: 有一些program,每个program可能暂时无联系人,有一个联系人或不止一个联系人。需要找出每个program的一个联系人即可(没有则空)。即:SQL查询每组的第一条数据记录。
测试表如下: create table test ( program_id int, person_id int ); insert test select 1,1 union select 1,2 union select 2,3 union select 2,4
解决方案如下: select program_id, person_id from test as a where a.person_id in ( select top 1 person_id from test where program_id = a.program_id )
执行计划如下: Filter & Nested Loops中的Actual Number of Rows为2。
SQL的执行概括如下: 1)扫描test as a。提出一条记录。 2) 扫描test,提出与上述记录program_id相同的记录。 3) 提出这些记录中的top 1。 4)转到1)中,提下一条记录。 a = test; b = test; result; for (int i = 0; i < a.rows_number; i++) { for (int j = 0; j < b.rows_number; j++) { temp; if ( b.program_id == a.program_id ) temp.add(); result.add(temp.first()); } } 用partition分组+rownumber效率会更高 #2楼[楼主] 2012-12-28 16:57 caigen@马非码
Tks。改天示例加在正文后面。:) |
|
来自: herowuking > 《VC》