Oracle SQL 根据匹配 ID 更新 Table

Oracle SQL Update Table Based on Matching ID

我正在尝试根据 MASTER_CUSTOMERGPID 字段更新 table DIM_TRADING_ACCOUNTSGPID 字段,其中 MCUST_CODE MASTER_CUSTOMER 等于 DIM_TRADING_ACCOUNTSTRADING_CODE,无论我尝试什么,我每次都得到基本上相当于语法错误的东西。

我一直在接受 this question 的指导。到目前为止我所做的四次尝试以及错误如下。有人可以帮我获得适用于 oracle SQL 的正确语法吗?

注意:我在mcust_code上使用了upper,因为trading_code字段全部大写

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

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

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

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

尝试3(这一次returns错误:单行子查询returns不止一行)

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));

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

MERGE INTO dim_trading_accounts
  USING master_customer
    ON dim_trading_accounts.trading_code = upper(master_customer.mcust_code)
WHEN MATCHED THEN
  UPDATE
    SET dim_trading_accounts.gpid = master_customer.gpid;

您应该在子查询中使用 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 中的重复行,您可以确保在 update.

中使用 maxmin

尝试 3 在语法上是正确的,问题是 table 中的数据:似乎 master_customertrading_code returns 过滤了不止一行。这个对吗?在这种情况下,无法进行您正在寻找的更新,因为对于一个 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;