求一个update语句(interbase SQL语句)

时间:2022-03-02 00:37:38
  我的数据库软件是interbase7.0的,库里有两个表tb1和tb2,我现在想将tb2里的某个字段tb2field批量更新到了tb1field里。其实两个表的长度是一样的,他们的关键字段值tb1ID和tb2ID的值是一样的,我的目的就是想将tb2里的字段tb2field复制过来。

  我用了如下的SQL语句:
    Update Tb1 set tb1Field=(select tb2.tb2Field from tb2,tb1,where tb2.tb2ID=tb1.tb1ID)

    可是这样的语句在interbase7.0里不能通过?错误提示:"Multiple Rows in SingleTon Select",不过这样的表复制我以有都成功过,记得当前使用了in或者not in才通过的。现在记不起怎么回事了,高位高人,能不能帮个忙啊??? 

17 个解决方案

#1


Update Tb1 
set tb1Field=tb2.tb2Field 
from tb2,tb1 where tb2.tb2ID=tb1.tb1ID 

#2



create table t1(id int,ar varchar(10))
insert into t1
select 1,'a' union all
select 2,'b' union all
select 3,'c'
go

create table t2(id int,br varchar(10))
insert into t2
select 1,'aaa' union all
select 2,'bbb' union all
select 3,'ccc'
go

update t1
set ar = t2.br
from t2 where t1.id = t2.id
select * from t1

drop table t1,t2

id          ar
----------- ----------
1           aaa
2           bbb
3           ccc

(3 行受影响)

#3


  唉,上面的代码看上去是正确的,但在interbase7.0里不能通过啊
   下面是interbase中update的语法

   UPDATE [TRANSACTION Transaction] {Table | View}
SET Col = <Val> [, Col = <Val> …]
[WHERE <Search_Condition> | WHERE CURRENT OF Cursor]
[ORDER BY <Order_List>]
[ROWS <Value> [TO <Upper_Value>] [BY <Step_Value>][PERCENT][WITH TIES]];

#4


Update a set tb2Field=(select tb1Field from tb1 where tb1ID=a.tb2ID)
from tb2 a

#5


Update Tb1 set tb1Field=(select   tb2.tb2Field from tb2,tb1 where tb2.tb2ID=tb1.tb1ID ORDER BY tb2.tb2ID  rows   1   to   1 )

#6


很遗憾啊,上面两位的回复在interbase中还是不能通过啊。


   我记得我以前正确的语句是使用了in或者not in后才成功的,但现在就是不能想起当时是怎么使用的了

#7


  兄弟们,继续帮帮我呀

#8


不懂interbase 。。。
建议
自己参考interbase   update语法吧

#9


   祝大家新年快乐。

 感谢大家的参与,但这个SQL语句我现在是怎么也想不出来的啊, 

#10


   当时我该将这个SQL语句记下来呀。

#11


Update Tb1 set tb1Field=(select top 1 tb2.tb2Field from tb2,tb1,where tb2.tb2ID=tb1.tb1ID)

#12


Update Tb1 ,Tb2 
set TB1.tb1Field=tb2.tb2Field 
where  tb2.tb2ID=tb1.tb1ID

just try 。。语法我也不是很懂,希望有用

#13


Update Tb1 set tb1Field=(select top 1 tb2Field from tb2 where tb2ID=a.tb1ID) from tb1 a

#14


引用 13 楼 qianjin036a 的回复:
SQL code
Update Tb1 set tb1Field=(select top 1 tb2Field from tb2 where tb2ID=a.tb1ID) from tb1 a


   谢谢你的参与呀。不过很遗憾,这段SQL语句在InterBase里不能通过。错误提示为:

   Invalid token.
   Dynamic SQL Error.
   SQL error code = -104.
   Token unknown - line 1, char 48.
   1
  
 如果将“TOP 1”去掉的话,是错误提示为:
   .multiple rows in singleton select.
  
 记得当时我成功过,也是刚开始碰到这个错误提示。后来我使用了“IN”来进行筛选才成功的。但这个语句怎么使用的,现在是怎么也不清楚了,郁闷啊

#15


由于 select 语句可能会返回多行,因此直接把它赋给一个列值是不允许的.用top 1是获取所查到的第一个使结果只有一个.这句语句在MSSQL里应该没问题.你看看在InterBase里如何获取行集中的一行.
你说的用IN 似乎也不对,IN 是在查询条件里确定值的范围,能用于UPDATE么?

#16


   我也不清楚使用IN对不对,但以前肯定是使用这个“IN”过的,也不知道当时是怎么使用的了,

#17


在子查询里面用Max, Min之类的汇总函数看看,
咳人家都说了是"multiple rows in singleton select"
也就是说你的子查询可能会返回多条记录,而一旦发生这种情况,DB就不知道该把哪一条记录的内容贴到要修改的字段中去了...

#1


Update Tb1 
set tb1Field=tb2.tb2Field 
from tb2,tb1 where tb2.tb2ID=tb1.tb1ID 

#2



create table t1(id int,ar varchar(10))
insert into t1
select 1,'a' union all
select 2,'b' union all
select 3,'c'
go

create table t2(id int,br varchar(10))
insert into t2
select 1,'aaa' union all
select 2,'bbb' union all
select 3,'ccc'
go

update t1
set ar = t2.br
from t2 where t1.id = t2.id
select * from t1

drop table t1,t2

id          ar
----------- ----------
1           aaa
2           bbb
3           ccc

(3 行受影响)

#3


  唉,上面的代码看上去是正确的,但在interbase7.0里不能通过啊
   下面是interbase中update的语法

   UPDATE [TRANSACTION Transaction] {Table | View}
SET Col = <Val> [, Col = <Val> …]
[WHERE <Search_Condition> | WHERE CURRENT OF Cursor]
[ORDER BY <Order_List>]
[ROWS <Value> [TO <Upper_Value>] [BY <Step_Value>][PERCENT][WITH TIES]];

#4


Update a set tb2Field=(select tb1Field from tb1 where tb1ID=a.tb2ID)
from tb2 a

#5


Update Tb1 set tb1Field=(select   tb2.tb2Field from tb2,tb1 where tb2.tb2ID=tb1.tb1ID ORDER BY tb2.tb2ID  rows   1   to   1 )

#6


很遗憾啊,上面两位的回复在interbase中还是不能通过啊。


   我记得我以前正确的语句是使用了in或者not in后才成功的,但现在就是不能想起当时是怎么使用的了

#7


  兄弟们,继续帮帮我呀

#8


不懂interbase 。。。
建议
自己参考interbase   update语法吧

#9


   祝大家新年快乐。

 感谢大家的参与,但这个SQL语句我现在是怎么也想不出来的啊, 

#10


   当时我该将这个SQL语句记下来呀。

#11


Update Tb1 set tb1Field=(select top 1 tb2.tb2Field from tb2,tb1,where tb2.tb2ID=tb1.tb1ID)

#12


Update Tb1 ,Tb2 
set TB1.tb1Field=tb2.tb2Field 
where  tb2.tb2ID=tb1.tb1ID

just try 。。语法我也不是很懂,希望有用

#13


Update Tb1 set tb1Field=(select top 1 tb2Field from tb2 where tb2ID=a.tb1ID) from tb1 a

#14


引用 13 楼 qianjin036a 的回复:
SQL code
Update Tb1 set tb1Field=(select top 1 tb2Field from tb2 where tb2ID=a.tb1ID) from tb1 a


   谢谢你的参与呀。不过很遗憾,这段SQL语句在InterBase里不能通过。错误提示为:

   Invalid token.
   Dynamic SQL Error.
   SQL error code = -104.
   Token unknown - line 1, char 48.
   1
  
 如果将“TOP 1”去掉的话,是错误提示为:
   .multiple rows in singleton select.
  
 记得当时我成功过,也是刚开始碰到这个错误提示。后来我使用了“IN”来进行筛选才成功的。但这个语句怎么使用的,现在是怎么也不清楚了,郁闷啊

#15


由于 select 语句可能会返回多行,因此直接把它赋给一个列值是不允许的.用top 1是获取所查到的第一个使结果只有一个.这句语句在MSSQL里应该没问题.你看看在InterBase里如何获取行集中的一行.
你说的用IN 似乎也不对,IN 是在查询条件里确定值的范围,能用于UPDATE么?

#16


   我也不清楚使用IN对不对,但以前肯定是使用这个“IN”过的,也不知道当时是怎么使用的了,

#17


在子查询里面用Max, Min之类的汇总函数看看,
咳人家都说了是"multiple rows in singleton select"
也就是说你的子查询可能会返回多条记录,而一旦发生这种情况,DB就不知道该把哪一条记录的内容贴到要修改的字段中去了...