Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 循环时的数据库查询_Asp.net_Sql_Database - Fatal编程技术网

Asp.net 循环时的数据库查询

Asp.net 循环时的数据库查询,asp.net,sql,database,Asp.net,Sql,Database,我99%确定这个问题已经被问了100次,但我找不到关于最好的方法的任何信息 我有一个名为People的表,然后是一个名为Jobs的表,其中存储了他们所有的就业历史 在创建报告、仪表板等时,经常会出现这种情况。我们希望在其中列出每个人及其最近3份工作,例如: 约翰·史密斯 一些公司,2011年4月3日-2011年5月14日 另一家公司,3/12/2010-4/1/2011 不同的公司,8/1/2009-1/4/2010 萨莉·史密瑟斯 一些公司,2011年4月3日-2011年5月14日 另一家公司

我99%确定这个问题已经被问了100次,但我找不到关于最好的方法的任何信息

我有一个名为People的表,然后是一个名为Jobs的表,其中存储了他们所有的就业历史

在创建报告、仪表板等时,经常会出现这种情况。我们希望在其中列出每个人及其最近3份工作,例如:

约翰·史密斯

一些公司,2011年4月3日-2011年5月14日 另一家公司,3/12/2010-4/1/2011 不同的公司,8/1/2009-1/4/2010 萨莉·史密瑟斯

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

一些伪代码是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
正如你所看到的,我们目前正在做另一个查询,以便在遍历人员时获得每个人的工作。有更好的方法吗?这种方法似乎效率低下,并且会创建大量的数据库查询

或者,如果有人能给我指出以前问过的这个问题,那也很好

谢谢

编辑:我使用上面的方法是因为我需要能够处理我返回的每个作业行的作业字段。例如,设置日期格式、加粗公司名称等。仅返回一大行并将作业字段合并为一个大字符串是不可行的。

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

我建议您执行以下操作,并且只进行2次数据库调用

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

您可以在表上执行联接,这是非常低效的,因为您可以想象1000人的结果意味着1001个SQL查询。jobID对于每个人来说是增量的吗。那么,乔布斯的关键是人格,JobID?如果是这种情况,您可以使用简单的联接并避免Quassnoi的子查询。编辑:也许我错了,从前3个id中选择是很困难的。。。。获得前3行很容易。@poyrazoğlu-可以为每个人返回1行吗?我需要能够处理作业行中的各个字段。请参阅问题编辑谢谢。那么这些对我的应用程序代码意味着什么呢?例如,如果我使用vb.net或c,如何循环返回的行?我在问题中使用该方法的主要原因是,我希望能够处理作业行中的字段。可能会设置日期字段的格式,加粗公司名称文本等。这些方法是否只为每个人返回一行,而不允许我访问作业行中的各个字段?谢谢。对应用程序中过滤行的一般看法似乎是不要这样做。在这种情况下,使用筛选行是更好的选择,因为它可能会阻止为一页加载而进行数百次数据库调用吗?对不起,我不明白你问题的意思