我遇到了使用join进行Oracle更新SQL的问题。我有一个表A,其中有5列(C1, C2, C3, C4, C5)
;表B有3列(D1, D2, D3)
。对于表A,我只使用2列(C2, C3)
来连接表B (D1, D2)
,并使用表B列D3更新表A列C2。
对于表A,C2和C3都会有很多重复项;但是对于条件C4为10,将没有重复,这是我想要更新的。
例如,表A的记录为:
1,100,1500,10,'ORG'
1,200,2000,10,'ORG'
1,300,2500,10,'ORG'
2,1000,500,20,'PERSON'
2,1000,200,20,'PERSON'
2,2000,200,20,'PERSON'
你可以看到,对于C4为10,C2和C3没有重复。但是对于C4为20,C2和C3会有重复。
对于表B,它将类似于
100,1500,80
200,2000,100
300,3000,200
表B没有重复,并且将B与A连接为A.C2 = B.D1和A.C3 = B.D2将A.C2更新为B.D3。
我只需更新C4 = 10条记录即可根据B.D1和B.D2加入表B.
我有如下SQL,但是失败了
ORA-01779:无法修改列 映射到非密钥保留的 表
有谁能告诉我我的SQL有什么问题?
UPDATE (
SELECT A.C2 OID, B.D3 TID FROM A, B
WHERE A.C2 = B.D1 AND A.C3 = B.D2 AND A.C4=10 AND B.D3 <> ' ' )
SET OID = TID
非常感谢!
答案 0 :(得分:1)
您不能使用像...这样的更新语句
UPDATE A
set c2 = (select D3
from B
where B.D2 <> ' ' and
A.C2 = b.D1 and A.C3=B.D2)
)
where A.C4=10
此外,您的问题和问题描述本身看起来像一个难题,这很难理解。
您可以发布一些数据并创建表格语句,以便重现您的案例吗?(从下次开始......)
答案 1 :(得分:0)
UPDATE A
SET C2 = (
SELECT B.D3
FROM B
WHERE A.C2 = B.D1 AND A.C3 = B.D2)
WHERE A.C4=10
AND EXISTS (
SELECT *
FROM B2
WHERE A.C2 = B2.D1 AND A.C3 = B2.D2)
无需为update语句添加别名。此外,您在B.D2 <> ' '
和A.C3 = B.D2
上也有条件,因此在A.C3 <> ' '
上过滤也很容易,因为A是目标表。如果A.C3从不为空,那么甚至不需要条件。
答案 2 :(得分:0)
首先,听起来您正在尝试更新TableA。其次,Update语句的官方ANSI规范不直接在语句中提供连接(您只能通过子查询进行连接)。一个原因是,当涉及重复行时,它会产生歧义。所以,你可以尝试类似的东西:
Update A
Set OID = (
Select B.D3
From B
Where B.D1 = A.C2
And B.D2 = A.C3
And B.D3 Is Not Null
)
Where A.C4 = 10
And Exists (
Select 1
From B
Where B.D1 = A.C2
And B.D2 = A.C3
And B.D3 Is Not Null
)