可能是一个微不足道的问题,我查看了各种档案但找不到我的方式。
我的情况的简化示例。
我有一个带有列的表格,我想要更新来自另外两个表格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表所能做的事情,那是可行的吗?
答案 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);