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

我在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 

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-如果要更改