【问题标题】:SQLite- Update old value based on the new valueSQLite-根据新值更新旧值
【发布时间】:2018-07-11 10:06:18
【问题描述】:

我有一个包含以下数据的表格:

------------------------------------------
|ID|Name|Value|State |Version|Replaced_by|
------------------------------------------
|1 |Joe |10   |New   |1      |NULL       |
------------------------------------------
|2 |Ben |15   |New   |1      |NULL       |
------------------------------------------

然后我添加例如 2 个新行:

------------------------------------------
|ID|Name|Value|State |Version|Replaced_by|
------------------------------------------
|1 |Joe |10   |New   |1      |NULL       |
------------------------------------------
|2 |Ben |15   |New   |1      |NULL       |
------------------------------------------
|3 |Joe |20   |New   |2      |NULL       |
------------------------------------------
|4 |Dan |10   |New   |1      |NULL       |
------------------------------------------

然后我想执行更新,更新 NameState 组的最旧 VersionReplaced_byID 值是 NameState 组的最新 Version 值,所以看起来像这样:

------------------------------------------
|ID|Name|Value|State |Version|Replaced_by|
------------------------------------------
|1 |Joe |10   |New   |1      |3          |
------------------------------------------
|2 |Ben |15   |New   |1      |NULL       |
------------------------------------------
|3 |Joe |20   |New   |2      |NULL       |
------------------------------------------
|4 |Dan |10   |New   |1      |NULL       |
------------------------------------------

虽然我为我的问题找到了一个好看的答案,但它在 SQLite 中不起作用。我受到this 另一个问题的回答的启发。

UPDATE
  table1
SET
  replaced_by = i.id
FROM
  (
    SELECT
      id, name, state, version
    FROM
      table1 t1
    WHERE
      version = (
        SELECT
          MAX(version)
        FROM
          table1
        WHERE
          t1.name = table1.name
          AND t1.state = table1.state
          AND t1.replaced_by IS NULL
      )
  ) i
WHERE
  table1.name = i.name
  AND table1.state = i.state
  AND table1.version = i.version
  AND table1.replaced_by IS NULL

基本上,列 Replaced_by 用作附加的版本控制工具,并在从表中选择数据时减轻我的生活。

期待任何帮助。

【问题讨论】:

    标签: sql sqlite sql-update


    【解决方案1】:

    您可以将existsupdate 语句一起使用:

    update table
      set Replaced_by = (select max(t1.id) 
                         from table t1 
                         where t1.name = table.name and 
                               t1.State = table.State
                        )
    where exists (select 1 
                  from table t1 
                  where t1.name = table.name and 
                        t1.State = table.State and 
                        t1.id <> table.id
                  ) and replaced_by IS NULL;
    

    【讨论】:

    • 它似乎正在工作,但它也在使用他们的 ID 更新最新的,在 Replaced_by 列中没有留下 NULL 值。
    • 所以我从Replaced_by = () 复制了选择并添加到末尾为and id != ()。现在看起来不错。谢谢
    【解决方案2】:

    您是否考虑过将每个数据一一插入 你可以使用:

    更新(表名) 设置名称 = '丹' 其中 ID = 2

    更新(表名) 设定值 = '20' 其中 ID = 1

    更新(表名) 设置版本 = '1' 其中 ID = 1

    更新(表名) 设置replaced_by = '3' 其中 ID = 1

    为所有更新执行此操作

    【讨论】:

    • 我需要自动执行此操作,因此无法回答我的问题。
    猜你喜欢
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多