我正在尝试根据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));
答案 0 :(得分:3)
Attemp 3在语法上是正确的,问题是表中的数据:似乎master_customer
由trading_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)
您应该在子查询中使用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
中的重复行,则可以确保在max
中使用min
或update
。