我需要在表中添加一列,然后用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任何建议
披
答案 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);