2013-08-12 62 views
0

我有一個表productHistory優化查詢SQL使用join

productHistory (id_H , id_product , name , tsInsert); 

我想從表中得到productHistory的最後一個產品在給予期間(開始,結束): tsInsert必須開始之間結束。

我可以這樣做:

select max(id_H) 
from productHistory 
where tsInsert>=:start and tsInsert <=:end 
group by id_product; 

然後從productHistory全部選擇其中ID_H在前面的選擇。

此查詢非常繁重,有沒有其他解決方案使用正確的連接爲例子?

+4

你的說法是好得不能再好。我所能建議的「優化」是在表格中添加適當的索引。你使用的是什麼DBMS?你可以發佈查詢計劃嗎? –

+0

「非常重」是否意味着執行時間會很長? – athabaska

回答

0

我試過這個解決方案:

SELECT * FROM productHistory x 

    INNER JOIN 
    (
     SELECT MAX(id_H) as maxId 
     FROM productHistory 
     GROUP id_product 
    ) y 

ON x.id_H = y.maxId 
and x.TSINSERT >=:start and x.TSINSERT <=:end 
+2

你不應該回答你自己的問題,除了你的問題。請*編輯*您的問題並添加附加信息。另外嘗試添加執行計劃並添加您正在使用的DBMS。 –

+0

但這是我的解決方案 – junior

+0

大聲笑,我的錯誤,但我懷疑這會返回你所需要的。考慮以下兩行:id_h,id_product,tsInsert:1,99,01/01/2000和2,99,01/01/01,你的':start'> 1990將返回** no rows **。 –