除非我错过了您的问题中的某些内容,否则您只需更新:
update tb set b1 = (select a2 from Ta where a1 = b2);
更新 1
OP 提到她/他正在使用 sqlite 2.8.17,因此不支持“跨表”更新。
我发现这个链接提供了一种解决方法。它要求加入的字段是主键,这个问题就是这种情况。
这是声明:
insert or replace into tb (b2, b1)
select ta.a1, ta.a2
from ta, tb
where ta.a1=tb.b2;
我还没有测试过它,然后验证它执行时没有错误。据我所知,它应该与我在此更新之前发布的更新语句相同。
更新 2
正如OP指出的那样,上述内容存在问题。它将插入新记录而不是更新 Tb 中的现有记录。我现在确实看到了 OP 试图做的事情的矛盾:
假设使用 sqlite 3.xy。一个简单的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
唯一性使我的第一次更新中的解决方案正常工作,并防止上面暴露的唯一性违规。