問題描述如下:
有一些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()); } }
