如何使用 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
但是 maxValue
是 Rep[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 """
其次,您可以 运行 将表达式作为两个查询(可能在一个事务中)。这类似于您的示例,因为 update
是 DBIO
,而不是 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.
我想做这样的事情
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
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 """
其次,您可以 运行 将表达式作为两个查询(可能在一个事务中)。这类似于您的示例,因为 update
是 DBIO
,而不是 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.