OrientDB - Update with SUBSELECT

时间:2015-06-30 13:23:03

标签: orientdb

I want to update some rows of my table basing on other rows of the same table:

I try this:

UPDATE MyTable set myField = 
    (SELECT T1.myField
    FROM MyTable T1
    WHERE T1.id.substring(start,stop) = MyTable.id.substring(start,stop))

But OrientDB throws an error like this:

com.orientechnologies.orient.core.sql.OCommandSQLParsingException: Error on parsing command at position #XXX: Invalid keyword 'T1' Command:

2 个答案:

答案 0 :(得分:2)

首先,您在OrientDB中不能在类上使用Alias。

在这种情况下,您可以在子查询中使用$ parent。$ current,例如:

> update MyTable set myField = (
>         select myField
>         from MyTable
>         where myField is null
>         and id.substring(8,13) = $parent.$current.id.substring(8,13) and something else...
>          ) where myField is null and something else...

小心id的长度......

最诚挚的问候 微米。

答案 1 :(得分:0)

这不是字符串更新,而是整数更新。使用提供的GratefulDeadDatabase,您可以执行以下操作:

CONNECT remote:localhost/GratefulDeadConcerts;
SELECT performances FROM v;
----+------+------------
#   |@CLASS|performances
----+------+------------
0   |null  |null        
1   |null  |5           
2   |null  |1           
3   |null  |531         
4   |null  |394         
----+------+------------

UPDATE v SET performances = eval('performances + 2') WHERE performances IS NOT NULL;
SELECT performances FROM v;
----+------+------------
#   |@CLASS|performances
----+------+------------
0   |null  |null        
1   |null  |7           
2   |null  |3           
3   |null  |533         
4   |null  |396         
----+------+------------

因此更新适用于现有数据。我对OrientDB很新,所以也许专家可以告诉我,我是不是做了一件非常可怕的错误。

更新

请注意,在您的示例中,您使用同一个表中的值更新表。也就是说,从MyTable到MyTable(除非我误解了你的查询),甚至在同一行内。您可以使用WHERE子句上的条件仅更新感兴趣的行。在我的例子中,那是

WHERE performances IS NOT NULL