sqlite使用其他表中的select和match进行更改

时间:2012-04-28 14:39:14

标签: sqlite

我知道如何使用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

有什么想法吗?

2 个答案:

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