使用join更新重复列表

时间:2011-04-18 20:15:35

标签: sql oracle

我遇到了使用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

非常感谢!

3 个答案:

答案 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
                )