Oracle:无效标识符
我在oracle中使用以下查询。但是,它给出了一个错误,指出第5行中的“c.par”是无效参数。不知道为什么。列存在。我查过了。我已经为此奋斗了很长时间。我所要做的就是将一个表合并到另一个表中,并使用oracle更新它。有人能帮忙吗Oracle:无效标识符,oracle,sql-merge,Oracle,Sql Merge,我在oracle中使用以下查询。但是,它给出了一个错误,指出第5行中的“c.par”是无效参数。不知道为什么。列存在。我查过了。我已经为此奋斗了很长时间。我所要做的就是将一个表合并到另一个表中,并使用oracle更新它。有人能帮忙吗 MERGE INTO SPRENTHIERARCHIES USING ( SELECT c.PARENTCATEGORYID AS par, e.rootcategoryId AS root FROM SPRENT
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
子句中引用它们。您还对没有该列的目标表使用了using
子句中的列别名(除非您的表既有rootcategoryId和root,也有parentCategoryId和par)
因此:
UPDATE SET e.root=c.par
应该是:
UPDATE SET SPRENTHIERARCHIES.rootcategoryId= SPRENTCATEGORIES.par
WHERE e.rootcategoryId (+)= c.PARENTCATEGORYID
在using
子句中,您试图使用列别名作为同一查询级别,因此:
WHERE e.root (+)= c.par
应该是:
UPDATE SET SPRENTHIERARCHIES.rootcategoryId= SPRENTCATEGORIES.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。因此,更新(或合并)似乎毫无意义。别名只存在于using
子句中的e
和c
查询中。您试图在update
子句中引用它们。您还对没有该列的目标表使用了using
子句中的列别名(除非您的表既有rootcategoryId和root,也有parentCategoryId和par)
因此:
UPDATE SET e.root=c.par
应该是:
UPDATE SET SPRENTHIERARCHIES.rootcategoryId= SPRENTCATEGORIES.par
WHERE e.rootcategoryId (+)= c.PARENTCATEGORYID
在using
子句中,您试图使用列别名作为同一查询级别,因此:
WHERE e.root (+)= c.par
应该是:
UPDATE SET SPRENTHIERARCHIES.rootcategoryId= SPRENTCATEGORIES.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。因此,更新(或合并)似乎毫无意义。您的查询没有真正意义。为什么要使用合并
而不是简单的更新
?所以错误是“无效标识符”或“无效参数”?在这两种情况下,它都没有关联的ORA-code吗?除非您的SPRENTHIERARCHIES表同时包含rootcategoryId
和root
列,并且您的SPRENTCATEGORIES表同时包含parentCategoryId
和par
列,否则您会检查是否存在错误的名称。也许可以将表格定义添加到问题中以进行澄清。但这似乎并没有什么实际作用,如果匹配成功,您会在匹配时更新到相同的值。您的查询没有真正意义。为什么要使用合并
而不是简单的更新
?所以错误是“无效标识符”或“无效参数”?在这两种情况下,它都没有关联的ORA-code吗?除非您的SPRENTHIERARCHIES表同时包含rootcategoryId
和root
列,并且您的SPRENTCATEGORIES表同时包含parentCategoryId
和par
列,否则您会检查是否存在错误的名称。也许可以将表格定义添加到问题中以进行澄清。但这似乎没有什么实际作用,如果匹配成功,您将更新为相同的值。我将在SprentierrArchies中合并SPRENTCATEGORIES中的更多列,这就是我使用merge的原因。是的,我正在使用“c”和“e”,因为否则它会给我“ON子句中引用的列无法更新”错误。@KavitaSalvi-如果要更改ON子句中的列,无论使用什么名称或别名,都不能使用“合并”。将其更改为更无效也无济于事。如果您实际上只更新其他列—因为更新当前毫无意义—那么您就可以了。不过,您也可以使用update语句更新多个列。好的。。我想要的就是使用c.PARENTCATEGORYID=h.rootCategoryID更新SPRENTHIERARCHIES表,其中包含来自SPRENTCATEGORIES的一些列。我应该如何在oracle中做到这一点?只是不要设置SPRENTHIERARCHIES.rootcategoryId=…
。如果您在using
子句中获得了其他新值,您可以使用这些值进行更新,但不能更改on
列中的。(听起来像是在复制数据,这有点奇怪)。如果这没有帮助,那么你应该问一个新问题,解释你的需求,并显示数据和预期结果。是的。。复制列不是正确的方法。不管怎样,我改变了密码。。我可以通过不复制这两列来解决这个问题。非常感谢你的帮助!干杯:)我将在Sprentierarchies中合并更多来自SPRENTCATEGORIES的专栏,这就是我使用merge的原因。是的,我使用的是“c”和“e”,因为否则它会给我“ON子句中引用的列无法更新”错误。@KavitaSalvi-如果要更改