首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环时数据库查询

循环时数据库查询
EN

Stack Overflow用户
提问于 2011-07-20 16:21:44
回答 2查看 457关注 0票数 1

我99%肯定这个问题被问了100次,但我找不到任何这样做的最佳方法。

我有一张名叫“人”的桌子,还有一张叫做“乔布斯”的桌子,用来存储他们所有的就业历史。

在创建报告、仪表板等时,我们需要列出每个人和他们最后的3个工作(例如):

约翰·史密斯

4/3/2011-5/14/2011

  • Another公司,3/12/2010-4/1/2011

  • Different公司,8/1/2009-1/4/2010

公司

萨莉·史密斯

4/3/2011-5/14/2011

  • Another公司,3/12/2010-4/1/2011

  • Different公司,8/1/2009-1/4/2010

公司

等。

一些伪码,即VBish:

代码语言:javascript
复制
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行就没用了。

EN

回答 2

Stack Overflow用户

发布于 2011-07-20 16:24:38

假设SQL Server 2005或更高:

代码语言:javascript
复制
SELECT  *
FROM    people p
OUTER APPLY
        (
        SELECT  TOP 3 *
        FROM    job j
        WHERE   j.personId = p.id
        ORDER BY
                j.applicationDate DESC
        ) j

或者这个:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2011-07-20 16:45:14

我建议您执行以下操作,将只调用两个数据库。

代码语言:javascript
复制
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 While
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6765162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档