我有一个已经有值的表。我要更新的值为g_fuel_prft.billed_qty
。我需要将此表中的数字乘以另一个表中的数字来获得值。
因此,表名是inv_header
,其中包含inv_header.rpt_factor
,而g_fuel_prft
,其中包含g_fuel_prft.billed_qty
。条件是where inv_header.link=g_fuel_prft.lnk AND inv_header.rpt_factor = 0
。
一旦我选择了那些行,我想将它们更新为billed_qty * rpt_factor
update g_fuel_prft
set billed_qty = (inv_header.rpt_factor * g_fuel_prft.billed_qty)
where exists
(select billed_qty,ivh_rpt_factor from g_fuel_prft,inv_header
where g_fuel_prft.prodlnk = inv_header.ivh_link
and inv_header.ivh_rpt_factor = 0)
我收到201语法错误
答案 0 :(得分:0)
您不能这样引用inv_header.rpt_factor
。您需要将其放入子查询中。
UPDATE g_fuel_prft
SET billed_qty = ((SELECT inv_header.rpt_factor
FROM inv_header
WHERE g_fuel_prft.prodlnk = inv_header.ivh_link) *
g_fuel_prft.billed_qty)
WHERE EXISTS (SELECT *
FROM g_fuel_prft
JOIN inv_header ON g_fuel_prft.prodlnk = inv_header.ivh_link
WHERE inv_header.ivh_rpt_factor = 0)
对于EXISTS查询,选择列表无关紧要,并且*
是常规的。在SET子句中的子选择中,您可能需要更多限制。取决于连接列之间的关系类型(1:1、1:N,N:1,M:N)。
鉴于下面的最小模式,上面的查询在语法上是有效的。没有有效的样本数据很难进行测试。
DROP TABLE IF EXISTS g_fuel_prft;
CREATE TABLE g_fuel_prft
(
prodlnk INTEGER NOT NULL,
billed_qty DECIMAL(8,2) NOT NULL
);
DROP TABLE IF EXISTS inv_header;
CREATE TABLE inv_header
(
rpt_factor DECIMAL(8,4) NOT NULL,
ivh_link INTEGER NOT NULL,
ivh_rpt_factor DECIMAL(8,4) NOT NULL
);