我99%肯定这个问题被问了100次,但我找不到任何这样做的最佳方法。
我有一张名叫“人”的桌子,还有一张叫做“乔布斯”的桌子,用来存储他们所有的就业历史。
在创建报告、仪表板等时,我们需要列出每个人和他们最后的3个工作(例如):
约翰·史密斯
4/3/2011-5/14/2011
公司
萨莉·史密斯
4/3/2011-5/14/2011
公司
等。
一些伪码,即VBish:
SELECT PersonID, Name FROM People
Do While datareaderPeople.Read()
Response.write(datareaderPeople("Name")
'SELECT TOP 3 PersonID, JobID, CompanyName, OtherFields FROM Jobs WHERE PersonID = datareaderPeople("PersonID") ORDER BY SomeDateField
Do While datareaderJobs.Read()
Response.write(datareaderJobs("CompanyName"))
End While
End While正如您所看到的,我们目前正在进行另一个查询,以便在遍历人员时为每个人获取乔布斯。有更好的方法吗?这种方式似乎效率低下,并创建了大量的db查询。
或者,如果有人能告诉我以前问过的这个问题,那也很好。
谢谢。
编辑:,我使用上面的方法,因为我需要能够为我返回的每个乔布斯行处理乔布斯字段。就像格式化日期,用粗体显示公司名称等等。只要把乔布斯字段组合成1条大字符串返回1行就没用了。
发布于 2011-07-20 16:24:38
假设SQL Server 2005或更高:
SELECT *
FROM people p
OUTER APPLY
(
SELECT TOP 3 *
FROM job j
WHERE j.personId = p.id
ORDER BY
j.applicationDate DESC
) j或者这个:
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY p.id ORDER BY j.appicationDate DESC) AS rn
FROM people p
LEFT JOIN
job j
ON j.personId = p.id
) q
WHERE rn <= 3发布于 2011-07-20 16:45:14
我建议您执行以下操作,将只调用两个数据库。
SELECT PersonID, Name FROM People
SELECT PersonID, JobID, CompanyName, OtherFields FROM Jobs
Do While datareaderPeople.Read()
Response.write(datareaderPeople("Name")
Filter Jobs records data with DataView using RowFilter = "PersonID = " + datareaderPeople("PersonID")
Do While FilteredRows.Read()
Response.write(FilteredRows("CompanyName"))
End While
End Whilehttps://stackoverflow.com/questions/6765162
复制相似问题