代码之家  ›  专栏  ›  技术社区  ›  Paul Tomblin

使用自联接更新

  •  4
  • Paul Tomblin  · 技术社区  · 14 年前

    我想更新一个表以指示某些行是其他行的父行,因此我在表中添加了一个“parentID”列。以下查询查找所有父级:

    SELECT ca1.id, ca2.id 
    FROM contactassociations ca1
    JOIN contactassociations ca2 ON (ca1.contactid = ca2.contactid)
    where ca1.entitytable = 'EMPLOYER' AND
    ca2.entitytable = 'CLIENT';
    

    但是当我尝试调整语法来进行更新时,它不起作用:

    UPDATE contactassociations ca1
    SET    ca1.parentid = ca2.id
    JOIN  contactassociations ca2 ON (ca1.contactid = ca2.contactid)
    WHERE ca1.entitytable = 'EMPLOYER' AND ca2.entitytable = 'CLIENT';
    

    我得到:

    Error starting at line 6 in command:
    UPDATE contactassociations ca1
    SET    ca1.parentid = ca2.id
    JOIN  contactassociations ca2 ON (ca1.contactid = ca2.contactid)
    WHERE ca1.entitytable = 'EMPLOYER' AND ca2.entitytable = 'CLIENT'
    Error at Command Line:7 Column:28
    Error report:
    SQL Error: ORA-00933: SQL command not properly ended
    00933. 00000 -  "SQL command not properly ended"
    *Cause:    
    *Action:
    

    请注意,第7行第28列是“设置”行的结尾。

    3 回复  |  直到 7 年前
        1
  •  10
  •   Quassnoi    14 年前

    Oracle不支持 JOIN 条款 UPDATE 声明。

    使用此:

    MERGE
    INTO    contactassociations ca1
    USING   contactassociations ca2
    ON      (
            ca1.contactid = ca2.contactid
            AND ca1.entitytable = 'EMPLOYER'
            AND  ca2.entitytable = 'CLIENT'
            )
    WHEN MATCHED THEN
    UPDATE
    SET     parentid = ca2.id
    
        2
  •  3
  •   David Miller    9 年前

    我发现下面的样式更容易阅读,但您需要在更新关键字后使用别名,而不是表名:

    UPDATE ca1
    SET    ca1.parentid = ca2.id
    FROM contactassociations ca1
    LEFT JOIN contactassociations ca2 ON (ca1.contactid = ca2.contactid)
    WHERE ca1.entitytable = 'EMPLOYER' AND ca2.entitytable = 'CLIENT'
    
        3
  •  0
  •   feetwet    7 年前
    -- Method #1
    update emp set MANAGERNAME= mgr.EMPNAME
    FROM SelfJoinTable emp , SelfJoinTable mgr where emp.MANAGERID = mgr.EMPID
    
    -- Method #2
    update emp 
    set  MANAGERNAME= mgr.EMPNAME  
    FROM SelfJoinTable emp 
       LEFT OUTER JOIN SelfJoinTable mgr 
       ON emp.MANAGERID = mgr.EMPID
    
    -- Method #3
    update emp 
    set  MANAGERNAME= mgr.EMPNAME  
    FROM SelfJoinTable emp 
       JOIN SelfJoinTable mgr 
       ON emp.MANAGERID = mgr.EMPID
    
    -- Method #4
    update emp 
    set  MANAGERNAME= mgr.EMPNAME 
     FROM SelfJoinTable emp 
       inner JOIN SelfJoinTable mgr 
       ON emp.MANAGERID = mgr.EMPID
    
    推荐文章