sqlite:使用来自其他2个表列的cat的列更新表列

时间:2016-07-27 08:25:25

标签: sqlite sql-update

可能是一个微不足道的问题,我查看了各种档案但找不到我的方式。

我的情况的简化示例。

我有一个带有列的表格,我想要更新来自另外两个表格u和v列i的值。为了达到这个目的,我使用像这样的中间表x。

create table t (i integer);
create table u (i integer);
create table v (i integer);

insert into t values (11);
insert into t values (12);
insert into t values (13);
insert into t values (14);


insert into u values (21);
insert into u values (22);

insert into v values (31);
insert into v values (32);

create table x as select * from u union all select * from v;

select rowid,* from x
rowid i
----- --
1     21
2     22
3     31
4     32

update t set i=(select * from x where rowid=t.rowid );

select rowid,* from t;
rowid i
----- --
1     21
2     22
3     31
4     32

碰巧我知道卡(t)=卡(u)+车(v)。我试图摆脱这个中间的x表。

我将t重置为11,12,13,14然后

update t set i=(select * from u union all select * from v)
where rowid=t.rowid;

select rowid,* from t"
rowid i
----- --
1     21
2     21
3     21
4     21

哎呀,我用select而不是更新来仔细检查。

select rowid,* from (select * from u union all select * from v)"
rowid i
----- --
      21
      22
      31
      32

哈没有subid选择。另一方面,我知道如何生成一个数字系列

with recursive s as
(select 1 as n union all select n+1 from s where n<4)
select n from s;
n
-----
1
2
3
4

但我不知道如何将这些东西结合起来实现我对x表所能做的事情,那是可行的吗?

1 个答案:

答案 0 :(得分:1)

假设rowid值中没有间隙,您可以通过向第二个表中的值添加适当的偏移量来构造序列:

> SELECT rowid,                            i FROM u
  UNION ALL
  SELECT rowid + (SELECT COUNT(*) FROM u), i FROM v;
rowid  i
-----  --
1      21
2      22
3      31
4      32

然后,您可以将其用作更新源:

WITH x(rowid, i) AS (
    ...
)
UPDATE t
SET i = (SELECT i FROM x
         WHERE rowid = t.rowid);