我有这个更新声明
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 COMMAND NOT PROPERLY ENDED”指向FROM行,
我还会优化此更新语句,因为这应该在大约2百万条记录上运行,怎么可能?
答案 0 :(得分:1)
我不能确定在没有看到您的数据库结构的情况下它是正确的答案,但首先: 你的语法错误,它应该是这样的:
UPDATE fin_prezzo as pr SET pr.ult_prezzo_euro = ...
然后你将不得不改变JOINS链,从fin_prezzo表中充分加入(作为第一个提到的表)。 如果它有问题,你可以'更新'语句中的另一个表(不更改/添加/删除更新的列)
广告优化部分: 最好先用SELECT语句(而不是UPDATE)来查看它是如何加入的(可能因为连接而重复行)并减少重复,或者不是必要的连接。 其次,将“规则”从WHERE语句移动到JOIN语句会更快 例如:
INNER JOIN fin_att_fin as faf ON fpl.attivita_fin_id=faf.attivita_fin_id AND faf.gstd_esist_b='S'
另一个好方法是比较数字而不是字符串('S','242'......),它只是更快
休息是尝试..
希望我帮了一下;)