2016-03-29 141 views
0

我有這樣的更新語句更新多個表和查詢優化

UPDATE 
    pr 
    SET 
    pr.ult_prezzo_euro = ROUND(pr.ult_prezzo/fs.cambio,7) 
    FROM --error SQL COMMAND NOT PROPERLY ENDED 
    fin_prodotto prod INNER JOIN 
    fin_prodotto_linea fpl ON prod.prodotto_id=fpl.prodotto_id INNER JOIN 
    fin_att_fin faf ON fpl.attivita_fin_id=faf.attivita_fin_id INNER JOIN 
    fin_prezzo pr ON pr.attivita_fin_id=faf.attivita_fin_id INNER JOIN 
    flx_sec_posizione_dt_upd fs ON pr.attivita_fin_id=fs.attivita_fin_id 
    where 
     prod.prodotto_id=43 
    and faf.codice_titolo_cad_s is not null 
    and pr.ult_prezzo = pr.ult_prezzo_euro 
    and faf.divisa_quot_t<>'242' 
    and prod.gstd_esist_b='S' 
    and fpl.gstd_esist_b='S' 
    and faf.gstd_esist_b='S' 
    and pr.gstd_esist_b='S' 
    and pr.gstd_ult_user_s in ('AGGIORNAMENTO_POSIZIONE') 
    and pr.ult_prezzo>0 
    and fs.cambio>0; 

它給我「SQL命令不正確地結束」指着從行,

,也是我將優化此更新語句,因爲這應該運行在大約2百萬條記錄上,怎麼可能?

回答

1

我不能肯定這將是正確的答案,沒有看到你的數據庫結構,但首先: 你有錯誤的語法,它應該是這樣的:

UPDATE fin_prezzo as pr SET pr.ult_prezzo_euro = ... 

,然後你將不得不改變連接鏈,充分加入fin_prezzo表(如提到的第一個表)。 ,是否有問題,你可以「更新」在聲明中另一個表(不改變/添加/刪除更新列)

廣告優化部分: 這將是一個好的開始SELECT語句(而不是UPDATE)看看它是如何加入的(也許因爲連接而重複行)並減少重複,或者不需要連接。 其次是更快地擺脫WHERE語句加入語句 例如「規則」:

INNER JOIN fin_att_fin as faf ON fpl.attivita_fin_id=faf.attivita_fin_id AND faf.gstd_esist_b='S' 

另一個好方法是比較數字,而不是字符串(「S」,「242」 ...),它是簡單快捷

剩下的就是努力..

希望我幫一點;)