Oracle更新使用多列而没有唯一键

时间:2017-10-15 02:49:20

标签: sql oracle sql-update

我首先要说我是新手。我有两个表(位置和资产)。位置表具有fac_id / bldg / location_code / loc_id,资产表具有fac_id / bldg / location_code / loc_id。我需要使用资产表中loc_id为null的位置表中的loc_id更新资产表loc_id。但是,需要在两个表中匹配fac_id / bldg / location_code以更新正确的loc_id。我有一个脚本,我继续得到错误。我已尝试过许多来自互联网研究的不同调整(加入,内部联接,合并,存在等等......)并且没有任何工作。在这个原始脚本上,我得到太多行错误或单行子查询返回多行。希望解决方案很简单,我不知道。

我感谢任何帮助,我的头因撞到墙上而受伤。

UPDATE asset b 
SET b.loc_id = (SELECT DISTINCT l.fac_id, l.bldg, l.location_code, l.loc_id 
                FROM location l 
                WHERE upper(trim(b.fac_id))=upper(trim(l.fac_id)) 
                     AND upper(trim(b.bldg))=upper(trim(l.bldg)) 
                   AND upper(trim(b.location_code))=upper(trim(l.location_code)) 
                ) 
WHERE b.loc_id IS NULL;

谢谢!

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是and rownum = 1

UPDATE asset b 
    SET b.loc_id = (SELECT l.loc_id 
                    FROM location l 
                    WHERE upper(trim(b.fac_id)) = upper(trim(l.fac_id)) AND
                          upper(trim(b.bldg)) = upper(trim(l.bldg)) AND
                          upper(trim(b.location_code)) = upper(trim(l.location_code)) AND
                          rownum = 1
                    ) 
    WHERE b.loc_id IS NULL;

但是,这可能不是一个“真正的”解决方案。你应该弄清楚为什么你是多个匹配的行。也许你的相关条件或你的逻辑有问题。