Как выполнить запрос Informix ISQL с объединением - PullRequest
1 голос
/ 19 апреля 2019

У меня есть таблица, в которой уже есть значения. Значение, которое я хочу обновить - 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

1 Ответ

0 голосов
/ 19 апреля 2019

Вы не можете сослаться на 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
);
...