Oracle:标识符无效

时间:2016-06-08 13:53:14

标签: oracle sql-merge

我在oracle中使用以下查询。但是,它给出了一个错误,指出第5行中的“c.par”是无效参数。不知道为什么。列存在。我检查了。我一直在努力解决这个问题。我想要做的就是将一个表合并到另一个表中并使用oracle更新它。有人可以帮忙吗?

MERGE INTO SPRENTHIERARCHIES 
USING ( SELECT c.PARENTCATEGORYID AS par,  
             e.rootcategoryId AS root 
        FROM  SPRENTCATEGORIES c,SPRENTHIERARCHIES e 
        WHERE e.root (+)= c.par 
      ) SPRENTCATEGORIES  
ON (SPRENTHIERARCHIES.rootcategoryId = SPRENTCATEGORIES.parentcategoryId) 
WHEN MATCHED THEN 
UPDATE SET e.root=c.par 

1 个答案:

答案 0 :(得分:2)

ec别名仅存在于using子句中的查询中。您试图在update子句中引用它们。您还使用using子句中的列别名来对应目标表,该目标表没有该列(除非您的表同时具有rootcategoryId和root,以及parentCategoryId和par)。

所以这个:

UPDATE SET e.root=c.par 

应该是:

UPDATE SET SPRENTHIERARCHIES.rootcategoryId= SPRENTCATEGORIES.par 

using子句中,您尝试将列别名用作相同级别的查询,因此:

    WHERE e.root (+)= c.par 

应该是:

    WHERE e.rootcategoryId (+)= c.PARENTCATEGORYID

您的on子句也是错误的,因为使用列别名:

ON (SPRENTHIERARCHIES.rootcategoryId = SPRENTCATEGORIES.par) 

但我建议您使用正确的join子句替换using子句中的旧语法:

MERGE INTO SPRENTHIERARCHIES 
USING ( SELECT c.PARENTCATEGORYID AS par,  
             e.rootcategoryId AS root 
        FROM  SPRENTCATEGORIES c
        LEFT JOIN SPRENTHIERARCHIES e 
        ON e.rootcategoryId = c.PARENTCATEGORYID 
      ) SPRENTCATEGORIES  
ON (SPRENTHIERARCHIES.rootcategoryId = SPRENTCATEGORIES.par) 
WHEN MATCHED THEN 
UPDATE SET SPRENTHIERARCHIES.rootcategoryId= SPRENTCATEGORIES.par  

你有一个更基本的问题,因为你正在尝试更新加入列;这将得到:

ORA-38104: Columns referenced in the ON Clause cannot be updated

正如Gordon Linoff建议你可以使用更新而不是合并。类似的东西:

UPDATE SPRENTHIERARCHIES h
SET h.rootcategoryId = (
  SELECT c.PARENTCATEGORYID
  FROM SPRENTCATEGORIES c
  WHERE c.PARENTCATEGORYID = h.rootCategoryID
)
WHERE EXISTS (
  SELECT null
  FROM SPRENTCATEGORIES c
  WHERE c.PARENTCATEGORYID = h.rootCategoryID
)

如果没有匹配的记录,where exists子句就在那里 - 原始查询中的外连接意味着。但是在这种形式中,更明显的是您要将rootcategoryId更新为相同的值,因为您选择的parentCategoryID 等于它。所以更新(或合并)似乎毫无意义。

相关问题