Как использовать предложение From внутри оператора обновления PostgreSQL - PullRequest
0 голосов
/ 22 апреля 2019

Я преобразовываю хранимую процедуру SQL в хранимую функцию PostgreSQL. В этой хранимой функции внутри Update есть предложение From.

Я хочу знать, как использовать Изнутри Update? Потому что я получаю ошибку table name "account" specified more than once

CREATE OR REPLACE FUNCTION ETL_Insert_ModifyData( instID numeric)

  RETURNS void
  LANGUAGE 'sql'

AS $$ 

        --Account
        UPDATE account
        SET  namount = stg_account.namount, 
             slocation = stg_account.sLocation, 
             ndept_id = stg_account.ndept_id ,
             account.naccount_cpc_mapping_id = stg_account.naccount_cpc_mapping_id
        FROM account 
            INNER JOIN stg_account ON account.naccount_id = stg_account.naccount_id
            INNER JOIN department ON stg_account.ndept_id = department.ndept_id
            INNER JOIN accountcpcmapping ON stg_account.naccount_cpc_mapping_id = accountcpcmapping.naccount_cpc_mapping_id

        WHERE account.ninst_id = instID
            AND department.ninst_id = instID
            AND accountcpcmapping.ninst_id = instID

        --print 'Account completed '    

    $$

1 Ответ

1 голос
/ 22 апреля 2019

Переместите условие JOIN с таблицей account и предложением stg_account в WHERE.Кроме того, вам не нужно ссылаться на account в SET.

Кроме того, предпочтительнее использовать более короткие псевдонимы (например, одну или две буквы), а не полные имена таблиц.

UPDATE account
SET
    namount   = stg_account.namount,
    slocation = stg_account.sLocation,
    ndept_id  = stg_account.ndept_id ,
    naccount_cpc_mapping_id = stg_account.naccount_cpc_mapping_id
FROM stg_account
INNER JOIN department ON stg_account.ndept_id = department.ndept_id
INNER JOIN accountcpcmapping ON
    stg_account.naccount_cpc_mapping_id = accountcpcmapping.naccount_cpc_mapping_id
WHERE account.naccount_id   = stg_account.naccount_id
    AND account.ninst_id    = instID
    AND department.ninst_id = instID
    AND accountcpcmapping.ninst_id = instID
...