如何使用Sqlite将表的字段更新为该字段和另一个(相关)表的字段的总和?

时间:2019-07-25 03:49:45

标签: sql sqlite

我需要将每个集合的sets.weight更新为等于workout.body_weight + sets.weight

我有一个表格sets,代表一组升降机,该升降机属于一个升降机组,又属于一个锻炼(锻炼有升降机组,每个升降机组都有升降机,每个升降机都有组)。 workout.body_weight是我举起那天的体重。

sets.weight是我为该特定组举起的重量。

对于加权引体向上,我只是将身体悬垂的重量存储在sets.weight中。我想将此字段更新为当天workouts.body_weight的当前值 plus

我尝试了类似的类似问题中发现的许多建议,但是在尝试复制时会遇到语法错误。可能是因为Sqlite具有更有限的功能集,而这些答案仅适用于MySQL或PostgreSQL等。

我设法选择相关数据:

SELECT
  *
FROM
  sets as T1
  inner join (
    SELECT
      workouts.body_weight + sets.weight as new_weight,
      sets.id as id
    FROM
      sets
      LEFT JOIN lifts ON sets.lift_id = lifts.id
      LEFT JOIN lift_groups ON lifts.lift_group_id = lift_groups.id
      LEFT JOIN workouts ON workouts.id = lift_groups.workout_id
    WHERE
      lifts.lift_id = 5
  ) T2 ON T1.id = T2.id

这将输出idlift_idrepsreps_goalweightnew_weightid字段(前5个是sets

中的所有字段

所有LEFT JOIN都可以将集合连接到相应的父锻炼,这样我就可以检索锻炼。body_weight

如何更改此设置以基本上完​​成UPDATE sets SET weight = new_weight的使用?

1 个答案:

答案 0 :(得分:0)

这最终成功了:

UPDATE
  sets
SET
  weight = (
    SELECT
      sets.weight + workouts.body_weight as new_weight
    FROM
      sets T2
      INNER JOIN lifts on sets.lift_id = lifts.id
      INNER JOIN lift_groups ON lifts.lift_group_id = lift_groups.id
      INNER JOIN workouts on workouts.id = lift_groups.workout_id
    WHERE
      lifts.lift_id = 5
      AND sets.id = T2.id
  )
where
  EXISTS (
    SELECT
      sets.weight + workouts.body_weight as new_weight
    FROM
      sets T2
      INNER JOIN lifts on sets.lift_id = lifts.id
      INNER JOIN lift_groups ON lifts.lift_group_id = lift_groups.id
      INNER JOIN workouts on workouts.id = lift_groups.workout_id
    WHERE
      lifts.lift_id = 5
      AND sets.id = T2.id
  )

让我大吃一惊的是,在sqlite中,我无法以UPDATE tablename AS alias . . .开始查询。相反,我必须省略别名,但是对于带括号的SELECT语句,我可以使用一个,然后将两个表称为tablename和tablealias。您可以在摘要中看到我所做的。

第一个和第二个带括号的SELECTS是等效的。第一个生成我要更新为的新值。这被输入到UPDATE部分。 WHERE EXISTS只是一种安全措施,可以确保在SELECT不返回任何行的情况下,权重不会设置为null。