如何使用连接执行Informix ISQL查询

问题描述 投票:1回答:1

我有一个已经有值的表。我想要更新的值是g_fuel_prft.billed_qty。我需要从这个表中多次使用另一个表中的数字来获取值。

所以表名是inv_header,其中包含inv_header.rpt_factorg_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语法错误

join informix
1个回答
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
);
© www.soinside.com 2019 - 2024. All rights reserved.