2016-07-15 107 views
3

我试图更新基础上的MASTER_CUSTOMERGPID字段表DIM_TRADING_ACCOUNTSGPID领域,其中在MASTER_CUSTOMERMCUST_CODE等于DIM_TRADING_ACCOUNTSTRADING_CODE不管我怎么努力,我得到的Oracle SQL更新表基本上每次都会产生语法错误。基于匹配ID

我一直在从this question指导。到目前为止我所做的四次尝试都是在错误之下。有人可以帮助我得到正确的语法的Oracle SQL的工作?

注:我上使用上mcust_code因为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(这个返回错误:单行子查询返回多个行)

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; 

回答

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重复的行,你可以肯定在update使用maxmin

+0

是的,我发现这和有趣的事情是,我过滤掉了'mccust_code'多'gpid'而且我仍然得到错误。 *(我将它们过滤掉了,因为我想更新其余部分并手动检查多个)* –

+0

可以显示您正在使用的完整查询吗? –

+0

没关系,我发现了其他两个罪犯,我错过了...... :)感谢您的帮助:)我认为我现在直接得到它:)尽管我没有使用'Max'解决方案,因为我需要更具体地了解什么,我会选择这个答案,因为它让我朝着正确的方向前进。 –

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;