簡體   English   中英

SQL-優化查詢以進行迭代

[英]SQL - Optimize query for iteration

我正在循環使用此查詢,並希望使其更快。

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和job_activity聯接在一起,使用的job ID等於job.name,這將在job_activity表上找到該作業的avg_runtime,但這樣做是針對一個大數據集。 使用“ with”查詢會更好嗎?

表格布局

job
****
id
name


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

這是修改后的查詢,在此查詢中,我們在子查詢中使用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

您似乎正在尋找一個人可能從事的每項工作的最新活動。 然后,您想要每個工作的最新活動。 就是說,我要啟動第一個預查詢(別名PreMax),在該查詢中,我將有問題的人的所有作業ID都加入到具有avg_runtime <> 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

嘗試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM