sqlite使用select(再次)

时间:2015-06-15 09:29:49

标签: sqlite sql-update


我需要在表中添加一列,然后用select(来自orignal表本身)的计算值填充它,就像这样

create table yo (ad integer primary key, pa integer, pd integer);
insert into yo values
  (1,1,1),(2,1,3),(3,1,4),(4,3,5),(5,4,2),(6,3,8),(7,1,9),(8,6,7),(9,3,6);
.header on
.mode column yo;
select * from yo;
ad          pa          pd
----------  ----------  ----------
1           1           1
2           1           3
3           1           4
4           3           5
5           4           2
6           3           8
7           1           9
8           6           7
9           3           6

'广告' col是一个有点地址,' pa' col是父母地址,' pd' col是该行的有点ID或值。 我想添加一个名为' pp'这将是一个父母ID'这将是这样计算的

select yo2.pd from yo yo1 join yo yo2 on yo2.ad=yo1.pa;
pd
----------
1
1
1
4
5
4
1
8
4

所以我想设置' pp'我尝试了这个输出,但显然我必须错过一些事情

alter table yo add column pp integer;
update yo set pp =
  (select yo2.pd as pp from yo yo1 join yo yo2 on yo2.ad=yo1.pa);

ad    pa   pd   pp
----  ---  ---  ---- 
1     1    1    1
2     1    3    1
3     1    4    1
4     3    5    1
5     4    2    1
6     3    8    1
7     1    9    1
8     6    7    1
9     3    6    1

我想要实现的目标是否可行,我在类似的问题上链接,我不理解答案,我发现这样的小案例

create table t1 (a int, b int);
insert into t1 values (1,0),(2,0);
create table t2 (a int, c int);
insert into t2 values (1,101),(2,102);
update t1 set b = (select c from t2 where t2.a = t1.a) where t1.b = 0;

这个确实更新了,为什么我的选择与后一个选择不同?
Thanx任何建议

3 个答案:

答案 0 :(得分:0)

我找到了一种方法,可以使用像这样的临时表来实现我想做的事情

create temp table ziv as
  select yo1.ad,yo2.pd as pp from yo yo1 join yo yo2 on yo2.ad=yo1.pa
update yo set pp=(select temp.ziv.pp from temp.ziv where temp.ziv.ad=yo.ad)
select * from yo
ad  pa   pd  pp
--- ---  --- ---
1   1    1   1
2   1    3   1
3   1    4   1
4   3    5   4
5   4    2   5
6   3    8   4
7   1    9   1
8   6    7   8
9   3    6   4

现在我想知道这只能通过1次更新(没有临时表)来完成 Thanx提前
干杯

答案 1 :(得分:0)

子查询必须引用外部UPDATE查询中的当前行,即,引用yo当前行中的某个值。

JOIN无法立即实现;您必须首先将连接条件转换为WHERE子句:

...(select yo2.pd as pp from yo yo1, yo yo2 where yo2.ad=yo1.pa)

然后省略从子查询引用外部查询的yo(无法重命名UPDATE中的表):

update yo set pp =
   (select yo2.pd as pp from yo yo2 where yo2.ad=yo.pa);

答案 2 :(得分:0)

Thanx CL为您的回复
我没有及时看到你的回复,可能是因为我没有刷新我的页面,所以我按照我的最后一个答案的逻辑进行了追踪,并且我想出了最终的查询,似乎没有中间表。

update yo set pp=(select pp from
(select yo1.ad as ad1,yo2.pd as pp from yo yo1 join yo yo2 on
   yo2.ad=yo1.pa)
   where ad1=yo.ad);