从同一个表中的列值更新sqlite表中的列

时间:2012-08-08 18:14:22

标签: sqlite

我已经搜索并找到了大量的例子,但我仍在努力使这项工作成功。

我在SQLite中有以下表格:

SELECT * FROM TableA;

ID|USER|NAME|PARENT
1|User1|SomeName|-1
2|User1|SomeOtherName|1
3|User2|SomeName|-1
4|User2|SomeOtherName|-1

具有SomeOtherName名称的ID 2的PARENT为ID 1 - 这是正确的。

具有SomeOtherName名称的ID 4的PARENT为ID -1 - 这是不正确的。它应该是ID 3。

我有许多不正确的记录(所有记录都具有相同的SomeOtherName名称和PARENT为-1)。

将它们绑在一起的列是USER。

我需要使用正确的父ID更新所有不正确的记录。

我试过以下无济于事:

DROP TABLE orphans;

CREATE TEMP TABLE orphans as
    SELECT TableA.id, TableA.user, TableA.name FROM TableA WHERE TableA.name = 'SomeOtherName' AND TableA.parent = -1;

UPDATE TableA
SET parent = (  SELECT TableA.id
                        FROM TableA
                        INNER JOIN orphans
                        ON TableA.name = 'SomeName' AND orphans.user = TableA.user
                )
WHERE TableA.user IN (  SELECT TableA.user
                                FROM TableA WHERE TableA.name = 'SomeOtherName' AND TableA.parent = -1 )
;

我似乎无法做对。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

据我所知,sqlite在UPDATE语句中具有非常有限的复杂查询功能。你不能使用多个表,我也没有办法从子查询中引用当前行的值。

相反,我想出了这个:

SELECT id, user, name,
  CASE name = 'SomeOtherName' AND parent = -1
  WHEN 1 THEN (
    SELECT MAX(id)
    FROM TableA A2
    WHERE A1.user = A2.user
    AND A2.name != 'SomeOtherName'
  ) ELSE parent END AS parent
FROM TableA A1;

这个应该是你想要的数据,对吗?您可以将其写入临时表,然后从那里将数据反馈到原始表中。如果您有唯一的密钥,则可以使用REPLACE进行反馈,如果没有,则使用DETELTE后跟INSERT。我创建了an example of the latter on sqlfiddle

答案 1 :(得分:1)

当然是迟到的回复,但我相信这可以在没有临时表的情况下完成。只是以正确的方式使用选择。 下面的代码在类似的表中适用于我:

UPDATE TableA SET PARENT = (
            SELECT ID
            FROM TableA AS T
            WHERE T.NAME = 'SomeName' AND T.USER = TableA.USER
        )
WHERE ID IN (
            SELECT ID
            FROM TableA
            WHERE TableA.NAME = 'SomeOtherName' AND TableA.PARENT = -1
            );