2015-06-30 6 views
2

Я хочу обновить несколько строк моей таблицы, основываясь на других строках одной таблицы:OrientDB - Обновление с подвыбором

Я стараюсь это:

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

Но OrientDB выдает ошибку, как это:

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

+0

Нужно ли для Orient использовать ключевое слово AS? FROM MyTable AS T1? –

+0

Уважаемый, с или без AS Orient возвращает ошибку –

+0

Я не вижу псевдонима таблиц, упомянутых вообще в документах. Попробуйте без псевдонима, если у вас есть секунда, просто набрав MyTable. –

ответ

2

первую очередь вы в OrientDB вы не можете использовать псевдоним на классах.

В этом случае вы можете использовать $ родительских $ ток в подзапросе, что-то вроде:.

> 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... 

Будьте внимателен к длине ид ...

С наилучшими пожеланиями М.

+0

Дорогой, отлично работает! Большое спасибо! –

+0

, где вы нашли информацию о $ parent. $ Current keywords? – Stormsson

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, поэтому, возможно, эксперт может сказать мне, если я просто сделал что-то ужасно ужасное.

UPDATE

Обратите внимание, что в вашем примере вы обновляете таблицу со значениями из одной и той же таблицы. То есть, из MyTable в MyTable (если я не понял ваш запрос) и даже в пределах одной строки. Вы можете использовать критерии в предложении WHERE, чтобы обновлять интересующие строки. В моем примере, который был

WHERE performances IS NOT NULL 
+0

Уважаемый, мой вопрос о подзапросе. Где в подзапросе вашего ответа? –

+0

Ах, извините, я не считаю, что это необходимо. Вы пытаетесь обновить таблицу со значениями из одной таблицы, поэтому вам не нужен подзапрос. –

Смежные вопросы