我正在将SQL存储过程转换为PostgreSQL存储函数。在Update
里面的这个存储函数中有From
子句。
我想知道如何在Update里面使用From?因为我得到错误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 '
$$
将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