基于匹配ID的Oracle SQL更新表

时间:2016-07-15 15:31:23

标签: sql oracle merge sql-update insert-update

我正在尝试根据GPID DIM_TRADING_ACCOUNTS GPID MASTER_CUSTOMER MCUST_CODE字段来更新表MASTER_CUSTOMER的{​​{1}}字段等于TRADING_CODE的{​​{1}},无论我尝试什么,我每次都得到的基本上是语法错误。

我一直在接受this question的指导。到目前为止,我所做的四次尝试都是错误的。有人可以帮我找到有效的oracle SQL语法吗?

注意:我在DIM_TRADING_ACCOUNTS使用了大写,因为mcust_code字段都是大写的

尝试1 (错误是:SQL命令未正确结束)

trading_code

尝试2 (错误是:缺少" SET"关键字)

UPDATE dim_trading_accounts dta
  SET dta.gpid = mc.gpid
FROM master_customer mc
WHERE UPPER(mc.mcust_code) = dta.trading_code;

尝试3 (这个返回错误:单行子查询返回多行)

UPDATE 
  dim_trading_accounts dta, master_customer mc
SET
  dta.gpid = mc.gpid
WHERE
  upper(mc.mcust_code) = dta.trading_code;

尝试4 (错误是:缺少" ON"关键字)

UPDATE dim_trading_accounts dta
SET dta.gpid = (SELECT mc.gpid
                FROM master_customer mc
                WHERE dta.trading_code = upper(mc.mcust_code))
WHERE EXISTS (SELECT 1
              FROM master_customer mc
              WHERE dta.trading_code = upper(mc.mcust_code));

2 个答案:

答案 0 :(得分:3)

Attemp 3在语法上是正确的,问题是表中的数据:似乎master_customertrading_code过滤返回多行。它是否正确?在这种情况下,无法进行您正在寻找的更新,因为只有一个trading_code可以关联不同的gpid值。

解决方法:仅在所有链接记录只有一个gpid值的情况下进行更新:

 UPDATE dim_trading_accounts dta
 SET dta.gpid = (SELECT MIN(mc.gpid)
                FROM master_customer mc
                 WHERE dta.trading_code = upper(mc.mcust_code))
 WHERE (SELECT COUNT(DISTINCT gpid)   
               FROM master_customer mc
              WHERE dta.trading_code = upper(mc.mcust_code)) = 1;

答案 1 :(得分:2)

您应该在子查询中使用maxmin来避免single-row subquery returns more than one row错误。

UPDATE 
  dim_trading_accounts dta
SET
  dta.gpid = (SELECT MAX(gpid) 
              FROM master_customer 
              WHERE upper(mcust_code) = dta.trading_code);

要查看错误出现的原因,请使用select并检查gpidtradingcode组合的结果。

 SELECT mc.gpid, dta.trading_code
 FROM master_customer mc
 JOIN dim_trading_accounts dta ON upper(mc.mcust_code) = dta.trading_code

如果您看到上面select中的重复行,则可以确保在max中使用minupdate