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

How to update column with another subquery value in Slick?

我想做这样的事情

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

但是 maxValueRep[Int] 而不是 Int

Slick 的 update doesn't support dynamic values or sub-queries。对于这种情况,您有几个选择。

首先,你可以使用Plain SQL:

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

其次,您可以 运行 将表达式作为两个查询(可能在一个事务中)。这类似于您的示例,因为 updateDBIO,而不是 Query

我希望 max 有一个可选值,因为 table:

中可能没有行
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 字段已经是一个选项,您可以通过在 maxValue 表达式的末尾添加 .result 来使用现有的理解方式,如@Duelist.