我在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
答案 0 :(得分:2)
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)
但我建议您使用正确的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 等于它。所以更新(或合并)似乎毫无意义。