2016-06-08 122 views
-1

我在oracle中使用以下查询。但是,它给出了一个错误,指出第5行中的“c.par”是一个无效参数。不知道为什么。列存在。我检查了。很长一段时间以来我一直在努力。我想要做的就是将一个表合并到另一个表中,并使用oracle进行更新。有人可以帮忙吗?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 
+2

您的查询确实没有意义。你为什么使用'merge'而不是简单的'update'? –

+0

所以错误是“无效标识符”或“无效参数”?在任何情况下,它是否没有关联的ORA代码? –

+0

除非您的SPRENTHIERARCHIES表具有'rootcategoryId'和'root'列,并且您的SPRENTCATEGORIES表具有'parentCategoryId'和'par'列,那么您检查是否存在错误的名称。也许添加表格定义到问题来澄清。但是这似乎并没有真正做任何事情,如果它有效的话,你会更新到相同的值。 –

回答

2

ec别名只有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为,它等于。所以更新(或合并)似乎毫无意义。

+0

我将在SPRENTHIERARCHIES中合并来自SPRENTCATEGORIES的更多列,这就是我使用合并的原因。是的,我使用'c'和'e',否则它会给我“ON子句中引用的列无法更新”错误。 –

+0

@KavitaSalvi - 如果要更改on子句中的列,则不能使用合并,无论使用何种名称或别名。改变它使其更加有效将无济于事。如果你实际上只是更新其他列 - 因为无论如何更新目前是毫无意义的 - 那么你会没事的。尽管如此,您也可以使用更新语句更新多个列。 –

+0

好吧..我想要的是我的SPRENTHIERARCHIES表更新,使用c.PARENTCATEGORYID = h.rootCategoryID从SPRENTCATEGORIES中的一些列。我应该如何在oracle中执行此操作? –