如何在Slick中用另一个子查询值更新列?

问题描述 投票:0回答:1

我想做这样的事情

UPDATE item
SET value = ( 
  SELECT max(value)
  FROM item
) 
WHERE id = 1;

我试过了

for {
  maxValue <- Tables.Item.map(_.value).max
  x <- Tables.Item
    .filter(item => item.id === 1)
    .map(_.value).update(maxValue)
} yield x

不过 maxValue 是一个 Rep[Int] 而不是 Int

scala slick
1个回答
2
投票

斯利克的 update 不支持动态值或子查询。. 对于这种情况,你有几个选择。

首先,你可以使用Plain SQL。

sqlu""" UPDATE item SET value = (SELECT max(value) FROM item) WHERE id = 1 """

第二,你可以将表达式作为两个查询来运行(可能在一个事务中)。这与你的例子类似,如 update 是一个 DBIO而不是 Query.

我希望 max 有一个可选的值,因为表中可能没有记录。

val updateAction: DBIO[Int] = 
   Tables.Item.map(_.value).max.result.flatMap {

       case Some(maxValue) => 
        Tables.Item
          .filter(item => item.id === 1)
          .map(_.value).update(maxValue)

       case None => 
         DBIO.successful(0) // ... or whatever behaviour you want
}

但是,也许你的 value 字段已经是一个选项,你可以使用你现有的理解与添加的 .result 头上 maxValue 如@Duelist所提到的表达方式。

© www.soinside.com 2019 - 2024. All rights reserved.