0

我知道如何使用 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 中的对应值替换 b1 中存储的值.

简化为: b1 = select a2 from Ta where a1 = b2

有任何想法吗?

4

2 回答 2

1

这个怎么样?

UPDATE Tb
    SET
        b1 = (SELECT a2 
              FROM Ta
              WHERE Tb.b2 = Ta.a1 )
    WHERE
        EXISTS (
            SELECT *
            FROM Ta
            WHERE Tb.b2 = Ta.a1 );
于 2012-04-28T15:24:04.417 回答
0

除非我错过了您的问题中的某些内容,否则您只需更新:

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唯一性使我的第一次更新中的解决方案正常工作,并防止上面暴露的唯一性违规。

于 2012-04-28T16:55:41.033 回答