我已经搜索并找到了大量的例子,但我仍在努力使这项工作成功。
我在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 )
;
我似乎无法做对。任何帮助将不胜感激。
答案 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
);