的e
和c
别名只有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)
但我建议你适当加入条款取代旧的语法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为,它等于。所以更新(或合并)似乎毫无意义。
您的查询确实没有意义。你为什么使用'merge'而不是简单的'update'? –
所以错误是“无效标识符”或“无效参数”?在任何情况下,它是否没有关联的ORA代码? –
除非您的SPRENTHIERARCHIES表具有'rootcategoryId'和'root'列,并且您的SPRENTCATEGORIES表具有'parentCategoryId'和'par'列,那么您检查是否存在错误的名称。也许添加表格定义到问题来澄清。但是这似乎并没有真正做任何事情,如果它有效的话,你会更新到相同的值。 –