Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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 SQL Server查询因计算而变慢?_Asp.net_Sql_Sql Server_Timeout - Fatal编程技术网

Asp.net SQL Server查询因计算而变慢?

Asp.net SQL Server查询因计算而变慢?,asp.net,sql,sql-server,timeout,Asp.net,Sql,Sql Server,Timeout,我负责一个旧的时间记录系统,它是用ASP.NETWeb表单编写的,使用ADO.NET2.0进行持久化 基本上,该系统允许用户添加有关他们正在做的工作的详细信息、分配给他们完成工作的小时数以及他们迄今为止在工作上花费的小时数 该系统还具有基于SQL查询的报告功能。最近,我注意到许多从系统运行的报告执行起来非常慢。该数据库大约有11个表,并且不存储太多数据。27000条记录是任何一个表拥有的记录最多的记录,大多数表甚至远低于1500条记录 因此,我不认为这个问题与大量数据有关,我认为更多的是与构造不

我负责一个旧的时间记录系统,它是用ASP.NETWeb表单编写的,使用ADO.NET2.0进行持久化

基本上,该系统允许用户添加有关他们正在做的工作的详细信息、分配给他们完成工作的小时数以及他们迄今为止在工作上花费的小时数

该系统还具有基于SQL查询的报告功能。最近,我注意到许多从系统运行的报告执行起来非常慢。该数据库大约有11个表,并且不存储太多数据。27000条记录是任何一个表拥有的记录最多的记录,大多数表甚至远低于1500条记录

因此,我不认为这个问题与大量数据有关,我认为更多的是与构造不良的sql查询有关,甚至可能与数据库设计中的sql查询有关

例如,有类似的查询

@start_date datetime, 
@end_date datetime,
@org_id int 

select distinct t1.timesheet_id, 
                t1.proposal_job_ref, 
                t1.work_date AS [Work Date], 
                consultant.consultant_fname + ' ' + consultant.consultant_lname AS [Person], 
                proposal.proposal_title AS [Work Title], 
                t1.timesheet_time AS [Hours],

--GET TOTAL DAYS ASSIGNED TO PROPOSAL
(select sum(proposal_time_assigned.days_assigned)-- * 8.0) 
from proposal_time_assigned
where proposal_time_assigned.proposal_ref_code = t1.proposal_job_ref ) 
as [Total Days Assigned],


--GET TOTAL DAYS SPENT ON THE PROPOSAL SINCE 1ST APRIL 2013 
(select isnull(sum(t2.timesheet_time / 8.0), '0') 
from timesheet_entries t2 
where t2.proposal_job_ref = t1.proposal_job_ref 
and t2.work_date <= t1.work_date 
and t2.work_date >= '01/04/2013' ) 
as [Days Spent Since 1st April 2013],

--GET TOTAL DAYS REMAINING ON THE PROPOSAL 
(select sum(proposal_time_assigned.days_assigned) 
from proposal_time_assigned 
where proposal_time_assigned.proposal_ref_code = t1.proposal_job_ref )
- 
(select sum(t2.timesheet_time / 8.0) 
from timesheet_entries t2 
where t2.proposal_job_ref = t1.proposal_job_ref 
and t2.work_date <= t1.work_date
 ) as [Total Days Remaining]

from timesheet_entries t1, 
consultant, 
proposal, 
proposal_time_assigned 

where (proposal_time_assigned.consultant_id = consultant.consultant_id)
     and (t1.proposal_job_ref = proposal.proposal_ref_code) 
     and (proposal_time_assigned.proposal_ref_code = t1.proposal_job_ref)
     and (t1.code_id = @org_id) and (t1.work_date >= @start_date) and (t1.work_date <= @end_date) 
    and (t1.proposal_job_ref <> '0')

order by 2, 3
它们将返回报告的数据。我甚至不确定是否有人能理解上面查询中发生的事情,但基本上有相当多的计算发生,即除法、乘法、减法。我猜这就是减缓sql查询速度的原因

我想我的问题是,有人能理解上面的问题,甚至建议如何加快速度吗

此外,是否应该在sql查询中执行上述计算?或者这应该在代码中完成

如果您能帮上忙,我们将不胜感激


谢谢。

我在您的查询中看到的问题是:

1> 未为表提供别名。 2> 使用的子查询消耗执行成本,而不是WITH子句

如果我编写您的查询,它将如下所示:

select distinct t1.timesheet_id, 
                t1.proposal_job_ref, 
                t1.work_date AS [Work Date], 
                c1.consultant_fname + ' ' + c1.consultant_lname AS [Person], 
                p1.proposal_title AS [Work Title], 
                t1.timesheet_time AS [Hours],

--GET TOTAL DAYS ASSIGNED TO PROPOSAL
(select sum(pta2.days_assigned)-- * 8.0) 
from proposal_time_assigned pta2
where pta2.proposal_ref_code = t1.proposal_job_ref ) 
as [Total Days Assigned],


--GET TOTAL DAYS SPENT ON THE PROPOSAL SINCE 1ST APRIL 2013 
(select isnull(sum(t2.timesheet_time / 8.0), 0) 
from timesheet_entries t2 
where t2.proposal_job_ref = t1.proposal_job_ref 
and t2.work_date <= t1.work_date 
and t2.work_date >= '01/04/2013' ) 
as [Days Spent Since 1st April 2013],

--GET TOTAL DAYS REMAINING ON THE PROPOSAL 
(select sum(pta2.days_assigned) 
from proposal_time_assigned pta2
where pta2.proposal_ref_code = t1.proposal_job_ref )
- 
(select sum(t2.timesheet_time / 8.0) 
from timesheet_entries t2 
where t2.proposal_job_ref = t1.proposal_job_ref 
and t2.work_date <= t1.work_date
 ) as [Total Days Remaining]

from timesheet_entries t1, 
consultant c1, 
proposal p1, 
proposal_time_assigned pta1

where (pta1.consultant_id = c1.consultant_id)
     and (t1.proposal_job_ref = p1.proposal_ref_code) 
     and (pta1.proposal_ref_code = t1.proposal_job_ref)
     and (t1.code_id = @org_id) and (t1.work_date >= @start_date) and (t1.work_date <= @end_date) 
    and (t1.proposal_job_ref <> '0')

order by 2, 3

检查上面的查询是否有任何索引选项和每个表中要处理的记录数。

我在您的查询中看到的问题是:

1> 未为表提供别名。 2> 使用的子查询消耗执行成本,而不是WITH子句

如果我编写您的查询,它将如下所示:

select distinct t1.timesheet_id, 
                t1.proposal_job_ref, 
                t1.work_date AS [Work Date], 
                c1.consultant_fname + ' ' + c1.consultant_lname AS [Person], 
                p1.proposal_title AS [Work Title], 
                t1.timesheet_time AS [Hours],

--GET TOTAL DAYS ASSIGNED TO PROPOSAL
(select sum(pta2.days_assigned)-- * 8.0) 
from proposal_time_assigned pta2
where pta2.proposal_ref_code = t1.proposal_job_ref ) 
as [Total Days Assigned],


--GET TOTAL DAYS SPENT ON THE PROPOSAL SINCE 1ST APRIL 2013 
(select isnull(sum(t2.timesheet_time / 8.0), 0) 
from timesheet_entries t2 
where t2.proposal_job_ref = t1.proposal_job_ref 
and t2.work_date <= t1.work_date 
and t2.work_date >= '01/04/2013' ) 
as [Days Spent Since 1st April 2013],

--GET TOTAL DAYS REMAINING ON THE PROPOSAL 
(select sum(pta2.days_assigned) 
from proposal_time_assigned pta2
where pta2.proposal_ref_code = t1.proposal_job_ref )
- 
(select sum(t2.timesheet_time / 8.0) 
from timesheet_entries t2 
where t2.proposal_job_ref = t1.proposal_job_ref 
and t2.work_date <= t1.work_date
 ) as [Total Days Remaining]

from timesheet_entries t1, 
consultant c1, 
proposal p1, 
proposal_time_assigned pta1

where (pta1.consultant_id = c1.consultant_id)
     and (t1.proposal_job_ref = p1.proposal_ref_code) 
     and (pta1.proposal_ref_code = t1.proposal_job_ref)
     and (t1.code_id = @org_id) and (t1.work_date >= @start_date) and (t1.work_date <= @end_date) 
    and (t1.proposal_job_ref <> '0')

order by 2, 3

检查上面的查询是否有任何索引选项和每个表中要处理的记录数。

我在您的查询中看到的问题是:

1> 未为表提供别名。 2> 使用的子查询消耗执行成本,而不是WITH子句

如果我编写您的查询,它将如下所示:

select distinct t1.timesheet_id, 
                t1.proposal_job_ref, 
                t1.work_date AS [Work Date], 
                c1.consultant_fname + ' ' + c1.consultant_lname AS [Person], 
                p1.proposal_title AS [Work Title], 
                t1.timesheet_time AS [Hours],

--GET TOTAL DAYS ASSIGNED TO PROPOSAL
(select sum(pta2.days_assigned)-- * 8.0) 
from proposal_time_assigned pta2
where pta2.proposal_ref_code = t1.proposal_job_ref ) 
as [Total Days Assigned],


--GET TOTAL DAYS SPENT ON THE PROPOSAL SINCE 1ST APRIL 2013 
(select isnull(sum(t2.timesheet_time / 8.0), 0) 
from timesheet_entries t2 
where t2.proposal_job_ref = t1.proposal_job_ref 
and t2.work_date <= t1.work_date 
and t2.work_date >= '01/04/2013' ) 
as [Days Spent Since 1st April 2013],

--GET TOTAL DAYS REMAINING ON THE PROPOSAL 
(select sum(pta2.days_assigned) 
from proposal_time_assigned pta2
where pta2.proposal_ref_code = t1.proposal_job_ref )
- 
(select sum(t2.timesheet_time / 8.0) 
from timesheet_entries t2 
where t2.proposal_job_ref = t1.proposal_job_ref 
and t2.work_date <= t1.work_date
 ) as [Total Days Remaining]

from timesheet_entries t1, 
consultant c1, 
proposal p1, 
proposal_time_assigned pta1

where (pta1.consultant_id = c1.consultant_id)
     and (t1.proposal_job_ref = p1.proposal_ref_code) 
     and (pta1.proposal_ref_code = t1.proposal_job_ref)
     and (t1.code_id = @org_id) and (t1.work_date >= @start_date) and (t1.work_date <= @end_date) 
    and (t1.proposal_job_ref <> '0')

order by 2, 3

检查上面的查询是否有任何索引选项和每个表中要处理的记录数。

我在您的查询中看到的问题是:

1> 未为表提供别名。 2> 使用的子查询消耗执行成本,而不是WITH子句

如果我编写您的查询,它将如下所示:

select distinct t1.timesheet_id, 
                t1.proposal_job_ref, 
                t1.work_date AS [Work Date], 
                c1.consultant_fname + ' ' + c1.consultant_lname AS [Person], 
                p1.proposal_title AS [Work Title], 
                t1.timesheet_time AS [Hours],

--GET TOTAL DAYS ASSIGNED TO PROPOSAL
(select sum(pta2.days_assigned)-- * 8.0) 
from proposal_time_assigned pta2
where pta2.proposal_ref_code = t1.proposal_job_ref ) 
as [Total Days Assigned],


--GET TOTAL DAYS SPENT ON THE PROPOSAL SINCE 1ST APRIL 2013 
(select isnull(sum(t2.timesheet_time / 8.0), 0) 
from timesheet_entries t2 
where t2.proposal_job_ref = t1.proposal_job_ref 
and t2.work_date <= t1.work_date 
and t2.work_date >= '01/04/2013' ) 
as [Days Spent Since 1st April 2013],

--GET TOTAL DAYS REMAINING ON THE PROPOSAL 
(select sum(pta2.days_assigned) 
from proposal_time_assigned pta2
where pta2.proposal_ref_code = t1.proposal_job_ref )
- 
(select sum(t2.timesheet_time / 8.0) 
from timesheet_entries t2 
where t2.proposal_job_ref = t1.proposal_job_ref 
and t2.work_date <= t1.work_date
 ) as [Total Days Remaining]

from timesheet_entries t1, 
consultant c1, 
proposal p1, 
proposal_time_assigned pta1

where (pta1.consultant_id = c1.consultant_id)
     and (t1.proposal_job_ref = p1.proposal_ref_code) 
     and (pta1.proposal_ref_code = t1.proposal_job_ref)
     and (t1.code_id = @org_id) and (t1.work_date >= @start_date) and (t1.work_date <= @end_date) 
    and (t1.proposal_job_ref <> '0')

order by 2, 3

检查以上查询中的任何索引选项和每个表中要处理的记录数。

检查数据库中下列表中的索引(如果这些列没有索引),然后从索引每个列开始

方案\时间\分配。方案\参考\代码 建议书\u时间\u分配。顾问\u id 时间表\u条目。代码\u id 时间表\u条目。提案\u作业\u参考 时间表\u条目。工作\u日期 顾问 提案。提案参考代码 如果没有所有这些索引,任何东西都无法改进此查询

查询中唯一会影响性能的是过滤[work_date]的方式。当前语法导致表扫描:

--bad
and t2.work_date <= t1.work_date 
and t2.work_date >= '01/04/2013'

检查数据库中下表中的索引。如果这些列没有索引,则从索引每个列开始

方案\时间\分配。方案\参考\代码 建议书\u时间\u分配。顾问\u id 时间表\u条目。代码\u id 时间表\u条目。提案\u作业\u参考 时间表\u条目。工作\u日期 顾问 提案。提案参考代码 如果没有所有这些索引,任何东西都无法改进此查询

查询中唯一会影响性能的是过滤[work_date]的方式。当前语法导致表扫描:

--bad
and t2.work_date <= t1.work_date 
and t2.work_date >= '01/04/2013'

检查数据库中下表中的索引。如果这些列没有索引,则从索引每个列开始

方案\时间\分配。方案\参考\代码 建议书\u时间\u分配。顾问\u id 时间表\u条目。代码\u id 时间表\u条目。提案\u作业\u参考 时间表\u条目。工作\u日期 顾问 提案。提案参考代码 如果没有所有这些索引,任何东西都无法改进此查询

查询中唯一会影响性能的是过滤[work_date]的方式。当前语法导致表扫描:

--bad
and t2.work_date <= t1.work_date 
and t2.work_date >= '01/04/2013'

检查数据库中下表中的索引。如果这些列没有索引,则从索引每个列开始

方案\时间\分配。方案\参考\代码 建议书\u时间\u分配。顾问\u id 时间表\u条目。代码\u id 时代 表\u条目。提案\u工作\u参考 时间表\u条目。工作\u日期 顾问 提案。提案参考代码 如果没有所有这些索引,任何东西都无法改进此查询

查询中唯一会影响性能的是过滤[work_date]的方式。当前语法导致表扫描:

--bad
and t2.work_date <= t1.work_date 
and t2.work_date >= '01/04/2013'

根据给出的信息,我必须对某些表关系进行有根据的猜测。如果发布表结构、索引等。。。我们可以完成此查询中的其余列

目前为止,此查询计算分配的天数、已用天数和剩余天数 对于关键时间表\u id和提案\u作业\u参考

我们要看到的是工作日期、时间表、时间、[人员]、提案名称与此相关。 这些计算是否按人员和提案名称进行

您可以使用为我们提供示例数据和输出,这样我们就可以计算出完整数据的含义,而不是进行猜测

    SELECT 
             q1.timesheet_id
            ,q1.proposal_job_ref
            ,q1.[Total Days Assigned]
            ,q2.[Days Spent Since 1st April 2013]
            ,(
                q1.[Total Days Assigned] 
                - 
                q2.[Days Spent Since 1st April 2013]
            ) AS [Total Days Remaining]
    FROM
    (
        select 
            t1.timesheet_id
            ,t1.proposal_job_ref
            ,sum(t4.days_assigned) as [Total Days Assigned]
        from tbl1.timesheet_entries t1
        JOIN tbl1.proposal t2
            ON t1.proposal_job_ref=t2.proposal_ref_code
        JOIN tbl1.proposal_time_assigned t4
            ON t4.proposal_ref_code = t1.proposal_job_ref
        JOIN tbl1.consultant t3
            ON t3.consultant_id=t4.consultant_id
        WHERE t1.code_id = @org_id
            AND t1.work_date BETWEEN @start_date AND @end_date
            AND t1.proposal_job_ref <> '0'
        GROUP BY t1.timesheet_id,t1.proposal_job_ref
    )q1
    JOIN
    (
        select 
            tbl1.timesheet_id,tbl1.proposal_job_ref
            ,isnull(sum(tbl1.timesheet_time / 8.0), '0') AS [Days Spent Since 1st April 2013]
        from tbl1.timesheet_entries tbl1
        JOIN tbl1.timesheet_entries tbl2
            ON tbl1.proposal_job_ref=tbl2.proposal_job_ref
            AND tbl2.work_date <= tbl1.work_date
            AND tbl2.work_date >= '01/04/2013'
        WHERE tbl1.code_id = @org_id
            AND tbl1.work_date BETWEEN @start_date AND @end_date
            AND tbl1.proposal_job_ref <> '0'
        GROUP BY tbl1.timesheet_id,tbl1.proposal_job_ref
    )q2
        ON q1.timesheet_id=q2.timesheet_id 
        AND q1.proposal_job_ref=q2.proposal_job_ref

根据给出的信息,我必须对某些表关系进行有根据的猜测。如果发布表结构、索引等。。。我们可以完成此查询中的其余列

目前为止,此查询计算分配的天数、已用天数和剩余天数 对于关键时间表\u id和提案\u作业\u参考

我们要看到的是工作日期、时间表、时间、[人员]、提案名称与此相关。 这些计算是否按人员和提案名称进行

您可以使用为我们提供示例数据和输出,这样我们就可以计算出完整数据的含义,而不是进行猜测

    SELECT 
             q1.timesheet_id
            ,q1.proposal_job_ref
            ,q1.[Total Days Assigned]
            ,q2.[Days Spent Since 1st April 2013]
            ,(
                q1.[Total Days Assigned] 
                - 
                q2.[Days Spent Since 1st April 2013]
            ) AS [Total Days Remaining]
    FROM
    (
        select 
            t1.timesheet_id
            ,t1.proposal_job_ref
            ,sum(t4.days_assigned) as [Total Days Assigned]
        from tbl1.timesheet_entries t1
        JOIN tbl1.proposal t2
            ON t1.proposal_job_ref=t2.proposal_ref_code
        JOIN tbl1.proposal_time_assigned t4
            ON t4.proposal_ref_code = t1.proposal_job_ref
        JOIN tbl1.consultant t3
            ON t3.consultant_id=t4.consultant_id
        WHERE t1.code_id = @org_id
            AND t1.work_date BETWEEN @start_date AND @end_date
            AND t1.proposal_job_ref <> '0'
        GROUP BY t1.timesheet_id,t1.proposal_job_ref
    )q1
    JOIN
    (
        select 
            tbl1.timesheet_id,tbl1.proposal_job_ref
            ,isnull(sum(tbl1.timesheet_time / 8.0), '0') AS [Days Spent Since 1st April 2013]
        from tbl1.timesheet_entries tbl1
        JOIN tbl1.timesheet_entries tbl2
            ON tbl1.proposal_job_ref=tbl2.proposal_job_ref
            AND tbl2.work_date <= tbl1.work_date
            AND tbl2.work_date >= '01/04/2013'
        WHERE tbl1.code_id = @org_id
            AND tbl1.work_date BETWEEN @start_date AND @end_date
            AND tbl1.proposal_job_ref <> '0'
        GROUP BY tbl1.timesheet_id,tbl1.proposal_job_ref
    )q2
        ON q1.timesheet_id=q2.timesheet_id 
        AND q1.proposal_job_ref=q2.proposal_job_ref

根据给出的信息,我必须对某些表关系进行有根据的猜测。如果发布表结构、索引等。。。我们可以完成此查询中的其余列

目前为止,此查询计算分配的天数、已用天数和剩余天数 对于关键时间表\u id和提案\u作业\u参考

我们要看到的是工作日期、时间表、时间、[人员]、提案名称与此相关。 这些计算是否按人员和提案名称进行

您可以使用为我们提供示例数据和输出,这样我们就可以计算出完整数据的含义,而不是进行猜测

    SELECT 
             q1.timesheet_id
            ,q1.proposal_job_ref
            ,q1.[Total Days Assigned]
            ,q2.[Days Spent Since 1st April 2013]
            ,(
                q1.[Total Days Assigned] 
                - 
                q2.[Days Spent Since 1st April 2013]
            ) AS [Total Days Remaining]
    FROM
    (
        select 
            t1.timesheet_id
            ,t1.proposal_job_ref
            ,sum(t4.days_assigned) as [Total Days Assigned]
        from tbl1.timesheet_entries t1
        JOIN tbl1.proposal t2
            ON t1.proposal_job_ref=t2.proposal_ref_code
        JOIN tbl1.proposal_time_assigned t4
            ON t4.proposal_ref_code = t1.proposal_job_ref
        JOIN tbl1.consultant t3
            ON t3.consultant_id=t4.consultant_id
        WHERE t1.code_id = @org_id
            AND t1.work_date BETWEEN @start_date AND @end_date
            AND t1.proposal_job_ref <> '0'
        GROUP BY t1.timesheet_id,t1.proposal_job_ref
    )q1
    JOIN
    (
        select 
            tbl1.timesheet_id,tbl1.proposal_job_ref
            ,isnull(sum(tbl1.timesheet_time / 8.0), '0') AS [Days Spent Since 1st April 2013]
        from tbl1.timesheet_entries tbl1
        JOIN tbl1.timesheet_entries tbl2
            ON tbl1.proposal_job_ref=tbl2.proposal_job_ref
            AND tbl2.work_date <= tbl1.work_date
            AND tbl2.work_date >= '01/04/2013'
        WHERE tbl1.code_id = @org_id
            AND tbl1.work_date BETWEEN @start_date AND @end_date
            AND tbl1.proposal_job_ref <> '0'
        GROUP BY tbl1.timesheet_id,tbl1.proposal_job_ref
    )q2
        ON q1.timesheet_id=q2.timesheet_id 
        AND q1.proposal_job_ref=q2.proposal_job_ref

根据给出的信息,我必须对某些表关系进行有根据的猜测。如果发布表结构、索引等。。。我们可以完成此查询中的其余列

目前为止,此查询计算分配的天数、已用天数和剩余天数 对于关键时间表\u id和提案\u作业\u参考

我们要看到的是工作日期、时间表、时间、[人员]、提案名称与此相关。 这些计算是否按人员和提案名称进行

您可以使用为我们提供示例数据和输出,这样我们就可以计算出完整数据的含义,而不是进行猜测

    SELECT 
             q1.timesheet_id
            ,q1.proposal_job_ref
            ,q1.[Total Days Assigned]
            ,q2.[Days Spent Since 1st April 2013]
            ,(
                q1.[Total Days Assigned] 
                - 
                q2.[Days Spent Since 1st April 2013]
            ) AS [Total Days Remaining]
    FROM
    (
        select 
            t1.timesheet_id
            ,t1.proposal_job_ref
            ,sum(t4.days_assigned) as [Total Days Assigned]
        from tbl1.timesheet_entries t1
        JOIN tbl1.proposal t2
            ON t1.proposal_job_ref=t2.proposal_ref_code
        JOIN tbl1.proposal_time_assigned t4
            ON t4.proposal_ref_code = t1.proposal_job_ref
        JOIN tbl1.consultant t3
            ON t3.consultant_id=t4.consultant_id
        WHERE t1.code_id = @org_id
            AND t1.work_date BETWEEN @start_date AND @end_date
            AND t1.proposal_job_ref <> '0'
        GROUP BY t1.timesheet_id,t1.proposal_job_ref
    )q1
    JOIN
    (
        select 
            tbl1.timesheet_id,tbl1.proposal_job_ref
            ,isnull(sum(tbl1.timesheet_time / 8.0), '0') AS [Days Spent Since 1st April 2013]
        from tbl1.timesheet_entries tbl1
        JOIN tbl1.timesheet_entries tbl2
            ON tbl1.proposal_job_ref=tbl2.proposal_job_ref
            AND tbl2.work_date <= tbl1.work_date
            AND tbl2.work_date >= '01/04/2013'
        WHERE tbl1.code_id = @org_id
            AND tbl1.work_date BETWEEN @start_date AND @end_date
            AND tbl1.proposal_job_ref <> '0'
        GROUP BY tbl1.timesheet_id,tbl1.proposal_job_ref
    )q2
        ON q1.timesheet_id=q2.timesheet_id 
        AND q1.proposal_job_ref=q2.proposal_job_ref

-20多年前,ANSI-92 SQL标准停止了旧式的逗号分隔表列表样式。这是一个很好的转换为SQL Server表值函数而不是单一查询的候选者……使用逗号分隔表和where子句而不是联接不会对性能产生任何影响。@marc\u s-是的,但这只是一种风格,查询优化器不应该因此受到太大的负面影响,尽管在某些情况下可能会受到影响。@DavidFleeman:当然,这可能对性能没有多大帮助,但它肯定会帮助提高可读性,并与当前标准保持同步20多年前,ANSI-92 SQL标准停止了旧式的逗号分隔表列表样式。这是一个很好的转换为SQL Server表值函数而不是单一查询的候选者……使用逗号分隔表和where子句而不是联接不会对性能产生任何影响。@marc\u s-是的,但这只是一种风格,查询优化器不应该因此受到太大的负面影响,尽管在某些情况下可能会受到影响。@DavidFleeman:当然,这可能对性能没有多大帮助,但它肯定会帮助提高可读性,并与当前标准保持同步20多年前,ANSI-92 SQL标准停止了旧式的逗号分隔表列表样式。这是一个很好的转换为SQL Server表值函数而不是单一查询的候选者……使用逗号分隔表和where子句而不是联接不会对性能产生任何影响。@marc\u s-是的,但这只是一种风格,查询优化器不应该因此受到太大的负面影响,尽管在某些情况下可能会受到影响。@DavidFleeman:当然,这可能对性能没有多大帮助,但它肯定会帮助提高可读性,并与当前标准保持同步20多年前,ANSI-92 SQL标准停止使用老式的逗号分隔表列表样式。这是一个很好的转换为SQL Server表值函数而不是单个表值函数的候选者
thic查询…使用逗号分隔的表和where子句而不是联接不会对性能产生任何影响。@marc_s-是的,但这只是一种风格,查询优化器不应该受到太大的负面影响,尽管在某些情况下可能会受到影响。@DavidFleeman:当然,这可能对性能没有多大帮助,但它肯定会有助于可读性,并与当前的标准保持同步!谢谢,这帮了大忙。谢谢,这帮了大忙。谢谢,这帮了大忙。谢谢,这帮了大忙。