甲骨文:无效的标识符
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
e
和 c
别名仅存在于 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 。所以更新(或合并)似乎毫无意义。
我在 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
e
和 c
别名仅存在于 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 。所以更新(或合并)似乎毫无意义。