在WHERE中为UPDATE语句

时间:2018-02-07 02:24:58

标签: sql postgresql sql-update aggregate-functions

我正在为使用PostgreSQL数据库的项目添加新功能。

数据库中有一个名为brew_sessions的表 - 它有一个名为condition_date的列。

brew_sessions通过recipesbrew_sessions.recipe_id = recipes.id表格相关联。然后将recipes连接到另一个名为recipe_fermentation_stepsrecipes.id = recipe_fermentation_steps.recipe_id的表。

status小于或等于计算的天数时,我想运行更新语句将brew_sessions字段上的condition_date字段设置为30 condition_date值。

此值是recipe_fermentation_steps.time的总和。

例如:

SELECT
  brew_sessions.id,
  SUM(recipe_fermentation_steps.time)
FROM brew_sessions
  INNER JOIN recipes ON brew_sessions.recipe_id = recipes.id
  INNER JOIN recipe_fermentation_steps ON recipes.id = recipe_fermentation_steps.recipe_id
GROUP BY brew_sessions.id

这导致我进入下面的查询:

UPDATE brew_sessions
SET status = 30 FROM recipes
  INNER JOIN recipe_fermentation_steps ON recipes.id = recipe_fermentation_steps.recipe_id
WHERE brew_sessions.recipe_id = recipes.id
AND brew_sessions.condition_date
    <= CURRENT_TIMESTAMP - INTERVAL '1 day' * SUM(recipe_fermentation_steps.time)

但是,由于您无法在WHERE中使用聚合函数,因此无法运行。

如何正确编写以上内容?

1 个答案:

答案 0 :(得分:1)

您可以使用子查询。像:

recipes

如果使用FK约束强制执行参照完整性,则根本不需要使用表angular.module('cookiesExample', ['ngCookies']) .controller('ExampleController', ['$cookies', function($cookies) { // Retrieving a cookie this.favoriteCookie = $cookies.get('myFavorite'); if(this.favoriteCookie) { console.log('they have been here before oooo spooky') } // Setting a cookie $cookies.put('myFavorite', 'oatmeal'); }]);

但是,这种方法值得怀疑。通常,您不会根据表中的当前时间编写与功能相关的值或值。使用VIEW(或MATERIALIZED VIEW)或类似名称。