我知道如何使用perl,python甚至MySQL来做这些事情,但我似乎无法弄清楚如何用sqlite做到这一点。希望也许有人可以提供帮助。
更新说明:我仅限于sqlite版本2.8.17
我有:
create table Ta (
a1 INTEGER PRIMARY KEY,
a2 VARCHAR(12) );
create table Tb (
b1 VARCHAR(12) PRIMARY KEY,
b2 INTEGER,
b3 VARCHAR(8),
b4 VARCHAR(8) );
我想通过命令行和基本的sql脚本做的是: 遍历Tb中的所有行,其中b2 == a1,我想用a2中的cooresponding值替换存储在b1中的值。
简化它是这样的: b1 =从Ta中选择a2,其中a1 = b2
有什么想法吗?
答案 0 :(得分:1)
这个怎么样?
UPDATE Tb
SET
b1 = (SELECT a2
FROM Ta
WHERE Tb.b2 = Ta.a1 )
WHERE
EXISTS (
SELECT *
FROM Ta
WHERE Tb.b2 = Ta.a1 );
答案 1 :(得分:0)
除非我在你的问题中遗漏了一些内容,否则你只需要更新:
update tb set b1 = (select a2 from Ta where a1 = b2);
更新1
OP提到她/他正在使用sqlite 2.8.17,因此不支持“跨表”更新。
我发现这个link提供了一种解决方法。它要求加入的字段是主键,这就是这个问题的例子。
以下是声明:
insert or replace into tb (b2, b1)
select ta.a1, ta.a2
from ta, tb
where ta.a1=tb.b2;
我没有测试过,否则验证它是否正确执行。就我的SQL知识而言,它应该与我在此更新之前发布的更新语句相同。
更新2
OP指出上述问题。它将插入新记录而不是更新Tb中的现有记录。我现在看到OP试图做的事情存在矛盾:
假设使用sqlite 3.x.y。一个简单的update
语句可以完成工作。问题是,只要Tb
中的多个记录与b2
中存在的Ta.a1
值相同,它就会失败:
sqlite> create table ta (
...> a_key INTEGER PRIMARY KEY,
...> a_val TEXT);
sqlite> create table tb (
...> b_key TEXT PRIMARY KEY,
...> b_val INTEGER);
sqlite> insert into ta values (1, 'a');
sqlite> insert into tb values ('z', 1);
sqlite> insert into tb values ('y', 1);
sqlite> update tb set b_key=(select a_val from ta where a_key=b_val);
Error: column b_key is not unique
所以这里的解决方案是使Tb1.b2
唯一:
create table Tb (
b1 VARCHAR(12) PRIMARY KEY,
b2 INTEGER UNIQUE,
b3 VARCHAR(8),
b4 VARCHAR(8));
使Tb.b2
唯一使我的第一次更新中的解决方案正常工作,并且阻止上面公开的唯一性违规。