甲骨文:无效的标识符

Oracle: Invalid identifier

我在 Oracle 中使用以下查询。但是,它给出了一个错误,指出第 5 行中的 "c.par" 是一个无效参数。不知道为什么。列存在。我检查了。我已经为此苦苦挣扎了很长时间。我想要做的就是将一个 table 合并到另一个并使用 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 

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

所以这个:

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) 

但我建议您将 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 。所以更新(或合并)似乎毫无意义。