2015-04-22 3 views
1

Учитывая таблицу следующие виджетыОбновление Squeryl от выбора?

╔════╦═════════╦═════╗ 
║ id ║ prev_id ║ foo ║ 
╠════╬═════════╬═════╣ 
║ 1 ║   ║ bar ║ 
║ 2 ║  1 ║  ║ 
╚════╩═════════╩═════╝ 

И следующий SQL-запрос

UPDATE widgets 
SET 
    widgets.foo = 
    (
    SELECT widgets.foo 
    FROM widgets 
    WHERE widgets.id = 1 
    ) 
WHERE 
    widgets.id = 2 

Как сделать выше обновление в squeryl?

Я попытался

update(widgets) (
    w=> 
     where(w.id === 2) 
     set(w.foo := from(widgets)(prevW => where(prevW.id === 1) select foo)) 
) 

Но это дало мне следующую компиляции ошибка:

error: No implicit view available from org.squeryl.Query[Option[String]] => org.squeryl.dsl.ast.TypedExpressionNode[Option[org.squeryl.PrimitiveTypeMode.StringType]]. 
+0

Я не уверен, экспромтом. Думаю, вам лучше повезти в списке Скважина: https://groups.google.com/forum/#!forum/squeryl –

ответ

1

Похоже Squeryl добавлена ​​поддержка вложенных запросах с https://github.com/max-l/Squeryl/commit/e75ddecf4a0855771dd569b4c4df4e23fde2133e

Однако необходимо агрегатный запрос что гарантированно вернет один результат. Это делается с помощью предложения compute.

Я придумал обходное решение, используя вычисление (min (foo)).

Так что мое решение заканчивает тем, как

update(widgets) (
    w=> 
    where(w.id === 2) 
    set(w.foo := from(widgets)(prevW => where(prevW.id === 1) compute(min(foo)))) 
) 

Может быть, должно быть single агрегатная функция, которая генерирует исключение, если запрос возвращает более одного результата.

Похожие беседы:

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