Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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
替换sql server子查询以加快查询速度,而不是爬行_Sql_Sql Server_Sql Server 2008_Subquery - Fatal编程技术网

替换sql server子查询以加快查询速度,而不是爬行

替换sql server子查询以加快查询速度,而不是爬行,sql,sql-server,sql-server-2008,subquery,Sql,Sql Server,Sql Server 2008,Subquery,我想加快这个查询的速度,我尝试了各种连接,但我似乎不能不使用连接重复查询storm2=1和storm2=2 SELECT v1.id ,v1.StormOut ,v1.StormNo ,v1.StormYes ,v1.Equipment ,( SELECT TimeOn FROM [v_StormLog] WHERE vehicle = v1.Vehicle AND Storm2 =

我想加快这个查询的速度,我尝试了各种连接,但我似乎不能不使用连接重复查询storm2=1和storm2=2

SELECT v1.id
    ,v1.StormOut
    ,v1.StormNo
    ,v1.StormYes
    ,v1.Equipment
    ,(
        SELECT TimeOn
        FROM [v_StormLog]
        WHERE vehicle = v1.Vehicle
            AND Storm2 = 1
            AND CurrentDate = v1.CurrentDate
        ) AS TimeOn
    ,v1.Vehicle
    ,v1.NAME
    ,v1.Equipment AS Equip
    ,(
        SELECT ScheduleOrig
        FROM [v_StormLog]
        WHERE vehicle = v1.Vehicle
            AND Storm2 = 1
            AND CurrentDate = v1.CurrentDate
        ) AS ScheduleOrig
    ,(
        SELECT ScheduleHTML
        FROM [v_StormLog]
        WHERE vehicle = v1.Vehicle
            AND Storm2 = 1
            AND CurrentDate = v1.CurrentDate
        ) AS ScheduleHTML
    ,(
        SELECT Schedule
        FROM [v_StormLog]
        WHERE vehicle = v1.Vehicle
            AND Storm2 = 1
            AND CurrentDate = v1.CurrentDate
        ) AS Schedule
    ,(
        SELECT TimeOff
        FROM [v_StormLog]
        WHERE vehicle = v1.Vehicle
            AND Storm2 = 1
            AND CurrentDate = v1.CurrentDate
        ) AS TimeOff
    ,v1.StormTimeOn
    ,v1.StormTimeOff
    ,v1.StormOut AS 'Out'
    ,v1.StormYes AS Yes
    ,v1.StormNo AS No
    ,(
        SELECT comments
        FROM [v_StormLog]
        WHERE vehicle = v1.Vehicle
            AND Storm2 = 1
            AND CurrentDate = v1.CurrentDate
        ) AS comments
    ,v1.StormComments
    ,(
        SELECT Comments
        FROM [v_StormLog]
        WHERE vehicle = v1.Vehicle
            AND Storm2 = 1
            AND CurrentDate = v1.CurrentDate
        ) AS CommentsHTML
    ,v1.Storm2
FROM [v_StormLog] v1
WHERE DATEADD(dd, DATEDIFF(dd, 0, v1.[CurrentDate]), 0) = @Date
    AND v1.sgroup = 'North'
    AND v1.Storm2 = @storm2
ORDER BY v1.ScheduleHTML
    ,v1.NAME

您需要将表本身连接起来。这将减少内部选择的数量。您仍然应该检查是否有适当的索引来查看执行计划

SELECT v1.*, v2.*     -- update using the fields you need
FROM [v_StormLog] v1
JOIN [v_StormLog] v2
  ON v2.vehicle = v1.Vehicle       
 AND v2.CurrentDate = v1.CurrentDate
WHERE
    DATEADD(dd, DATEDIFF(dd, 0, v1.[CurrentDate]), 0) = @Date
AND v1.sgroup = 'North'
AND v1.Storm2 = @storm2    
AND v2.Storm2 = 1
此外,您还有重复的字段

,v1.StormOut
,v1.StormNo
,v1.StormYes


如果我没记错的话,这种风格的子查询会被转换为外部联接,但您应该检查您的执行计划以确保。假设是这样的话:

SELECT v1.id
    ,v1.StormOut
    ,v1.StormNo
    ,v1.StormYes
    ,v1.Equipment
    ,v2.TimeOn AS TimeOn
    ,v1.Vehicle
    ,v1.NAME
    ,v1.Equipment AS Equip
    ,v2.ScheduleOrig AS ScheduleOrig
    ,v2.ScheduleHTML AS ScheduleHTML
    ,v2.Schedule AS Schedule
    ,v2.TimeOff AS TimeOff
    ,v1.StormTimeOn
    ,v1.StormTimeOff
    ,v1.StormOut AS 'Out'
    ,v1.StormYes AS Yes
    ,v1.StormNo AS No
    ,v2.comments AS comments
    ,v1.StormComments
    ,v2.Comments AS CommentsHTML
    ,v1.Storm2
FROM [v_StormLog] v1
LEFT JOIN [v_StormLog] v2
    ON  v2.vehicle = v1.Vehicle
    AND v2.CurrentDate = v1.CurrentDate
    AND v2.Storm2 = 1
WHERE v1.[CurrentDate] >= @Date
    AND v1.[CurrentDate] <  DATEADD(dd,@Date,1)
    AND v1.sgroup = 'North'
    AND v1.Storm2 = @storm2
ORDER BY v1.ScheduleHTML
    ,v1.NAME

这意味着CurrentDate在@Date当天或之后,在@Date之后一天的午夜之前。

至少向我们展示执行计划
SELECT v1.id
    ,v1.StormOut
    ,v1.StormNo
    ,v1.StormYes
    ,v1.Equipment
    ,v2.TimeOn AS TimeOn
    ,v1.Vehicle
    ,v1.NAME
    ,v1.Equipment AS Equip
    ,v2.ScheduleOrig AS ScheduleOrig
    ,v2.ScheduleHTML AS ScheduleHTML
    ,v2.Schedule AS Schedule
    ,v2.TimeOff AS TimeOff
    ,v1.StormTimeOn
    ,v1.StormTimeOff
    ,v1.StormOut AS 'Out'
    ,v1.StormYes AS Yes
    ,v1.StormNo AS No
    ,v2.comments AS comments
    ,v1.StormComments
    ,v2.Comments AS CommentsHTML
    ,v1.Storm2
FROM [v_StormLog] v1
LEFT JOIN [v_StormLog] v2
    ON  v2.vehicle = v1.Vehicle
    AND v2.CurrentDate = v1.CurrentDate
    AND v2.Storm2 = 1
WHERE v1.[CurrentDate] >= @Date
    AND v1.[CurrentDate] <  DATEADD(dd,@Date,1)
    AND v1.sgroup = 'North'
    AND v1.Storm2 = @storm2
ORDER BY v1.ScheduleHTML
    ,v1.NAME
v1.[CurrentDate] >= @Date
AND v1.[CurrentDate] <  DATEADD(dd,@Date,1)