2014-09-26 75 views
0

我在循環中使用此查詢並希望使其更快。SQL - 爲迭代優化查詢

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 我使用作業的ID時等於job.name會找到我要的job_activity表作業的avg_runtime連接兩個表工作,job_activity,但這樣做了大數據集。會使用'與'查詢更好嗎?

表佈局

job 
**** 
id 
name 


job_activity 
************* 
id 
job_id 
avg_runtime 
+0

爲什麼你不能做到這一點與TOP 1查詢? Id列是否是job_activity中的唯一列? – 2014-09-26 16:53:28

+0

我有查詢的靜態job.name。因此,我使用job.name來查找job.id,我使用job.id查找job.activity表中的job.id所有作業。然後,對於那些相應的job.activity.id(這是job.activity表的主鍵),我找到了最大值,因爲這是作業的最後一個條目。我採取了那一行的avg_runtime。 – user3590149 2014-09-26 17:20:59

回答

1

這是修改後的查詢,我們通過一個子查詢獲取使用組最大,做一個內連接。

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 
+0

這不適合我。請參閱上述編輯。 – user3590149 2014-09-26 17:23:35

+0

名稱無效列。名字只是工作表。 – user3590149 2014-09-26 17:27:48

+0

@ user3590149,在子查詢中再添加一個連接以使其工作。 – radar 2014-09-26 17:55:54

0

看起來你正在尋找一個人可能工作的每項工作的最新活動。然後你想要什麼最新的活動是每個工作。也就是說,我開始了第一個預查詢(別名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 
+0

是Job和JobActivity和j.ID別名?否則就會大錯特錯。 – user3590149 2014-09-26 17:32:08

+0

@ user3590149,from子句有ex:「job j」或「job_activity ja」,其中「j」是作業的別名,「ja」是job_activity的別名。此外,外部連接集合分別使用「j2」和「ja2」來防止混淆數據來自哪裏。是否將第二個「JobActivity」修復爲「job_activity」,但區分大小寫不應該成爲問題。 – DRapp 2014-09-26 17:51:22

+0

哪一個更快? – user3590149 2014-09-26 18:41:16

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