Oracle SQL 根据匹配 ID 更新 Table
Oracle SQL Update Table Based on Matching ID
我正在尝试根据 MASTER_CUSTOMER
的 GPID
字段更新 table DIM_TRADING_ACCOUNTS
的 GPID
字段,其中 MCUST_CODE
MASTER_CUSTOMER
等于 DIM_TRADING_ACCOUNTS
的 TRADING_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;
您应该在子查询中使用 max
或 min
以避免 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
并检查 gpid
和 tradingcode
组合的结果。
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
.
中使用 max
或 min
尝试 3 在语法上是正确的,问题是 table 中的数据:似乎 master_customer
被 trading_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;
我正在尝试根据 MASTER_CUSTOMER
的 GPID
字段更新 table DIM_TRADING_ACCOUNTS
的 GPID
字段,其中 MCUST_CODE
MASTER_CUSTOMER
等于 DIM_TRADING_ACCOUNTS
的 TRADING_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;
您应该在子查询中使用 max
或 min
以避免 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
并检查 gpid
和 tradingcode
组合的结果。
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
.
max
或 min
尝试 3 在语法上是正确的,问题是 table 中的数据:似乎 master_customer
被 trading_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;