SQL - 优化迭代查询

时间:2014-09-26 16:41:02

标签: sql sql-server

我在循环中使用此查询并希望加快速度。

SELECT * FROM job_activity as ja
INNER JOIN job as j
  ON ja.job_id = j.id 
WHERE j.name = 'name'
  AND ja.avg_runtime <> 0 
  AND ja.id = (SELECT MAX(id) FROM job_activity 
                  WHERE job_id = ja.job_id and avg_runtime <> 0);

使用MS SQL 11 我正在使用job的id加入两个表job和job_activity,等于job.name,它会在job_activity表上找到该作业的avg_runtime,但是为大数据集执行此操作。将&#39;用于&#39;查询会更好吗?

表格布局

job
****
id
name


job_activity
*************
id
job_id
avg_runtime

3 个答案:

答案 0 :(得分:1)

这是修改后的查询,我们在子查询中使用group by得到最大值,并进行内连接。

SELECT * FROM job_activity  as ja 
join job as j 
on ja.job_id = j.id 
INNER JOIN
(
select ja.job_id, max(id) as id from job_activity ja
       join job j
       ON j.id = ja.job_id
where avg_runtime <> 0 
and j.name = 'name'
group by job_id
) T
ON T.id = ja.id

答案 1 :(得分:0)

看起来您正在寻找一个人可能正在从事的每项工作的最新活动。然后你想要每个相应工作的最新活动。也就是说,我正在启动第一个预查询(别名PreMax),我正在为有问题的人加入到具有avg_runtime&lt;&gt;的作业活动的所有作业ID。 0. max()仅通过作业通过组应用于每个作业。由此,它将是基于avg_runtime进行资格认证的人员的任何/所有工作的唯一列表。这样就可以根据这些值简单地重新连接到作业和作业活动表,并返回所有数据。

SELECT
       j2.*, ja2.*
   FROM
      ( SELECT
              j.ID,
              MAX( ja.id ) as MaxJAID
           from 
              job j
                 join job_activity ja
                    ON j.id = ja.job_id
                    and ja.avg_runtime <> 0
           where
              j.name = 'name'
           group by 
              j.id ) PreMax
        JOIN job j2 on PreMax.id = j2.id
        JOIN job_activity ja2 on PreMax.MaxJAID = ja2.id

答案 2 :(得分:0)

尝试:

SELECT a.*
FROM(
SELECT *,
ROW_NUMBER()OVER(PARTITION BY ja.job_id ORDER BY ja.id DESC) as rnk
FROM job_activity as ja
INNER JOIN job as j
  ON ja.job_id = j.id 
WHERE j.name = 'name'
  AND ja.avg_runtime <> 0 )a
WHERE a.rnk = 1