我在循环中使用此查询并希望加快速度。
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
答案 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