gpt4 book ai didi

asp.net - 循环查询数据库

转载 作者:搜寻专家 更新时间:2023-10-30 22:19:05 24 4
gpt4 key购买 nike

我 99% 确定这个问题已被问过 100 次,但我在 SO 上找不到任何有关执行此问题的最佳方法的信息。

我有一个名为 People 的表,然后是一个名为 Jobs 的表,其中存储了他们所有的工作经历。

在创建报告、仪表板等时,我们经常会在其中列出每个人及其最近 3 份工作(例如):

约翰·史密斯

  • 一些公司,4/3/2011-5/14/2011
  • 另一家公司,2010 年 3 月 12 日至 2011 年 4 月 1 日
  • 不同公司,2009 年 8 月 1 日至 2010 年 1 月 4 日

莎莉·史密瑟斯

  • 一些公司,4/3/2011-5/14/2011
  • 另一家公司,2010 年 3 月 12 日至 2011 年 4 月 1 日
  • 不同公司,2009 年 8 月 1 日至 2010 年 1 月 4 日

等等

一些 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

如您所见,我们目前正在执行另一个查询,以便在遍历人员时获取每个人的职位。有一个更好的方法吗?这种方式似乎效率低下并且会创建大量数据库查询。

或者,如果有人可以指出我之前提出的这个问题,那也很好。

谢谢。

编辑:我使用上面的方法是因为我需要能够对我返回的每个作业行的作业字段进行操作。比如格式化日期、加粗公司名称等。仅返回 1 大行并将 Jobs 字段组合成 1 个大字符串是行不通的。

最佳答案

假设 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

关于asp.net - 循环查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6765162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com