锁定老帖子 主题:早上面试的一道数据库问题,请教怎么做
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-14
两张表: A:id,age,column1,column2 B:id,age,column1,column2 A.id 与 B.id关联。 将B中age>40的column1,column2更新到A的相应记录中,只能写一个语句。 写出mysql和oracle两个版本。 不知道怎么写。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-05-14
oracle
update A set A.column1 = ( select b.column1 from B where B.id = A.id and B.age > 40 ), A.column2 = ( select b.column2 from B where B.id = A.id and B.age > 40 ) |
|
返回顶楼 | |
发表时间:2008-05-14
update a set column1=b.column1 ,column2=b.column2 from a ,b where a.id = b.id and b.age>40
|
|
返回顶楼 | |
发表时间:2008-05-14
armorking 写道 oracle && mysql
update A set A.column1 = ( select b.column1 from B where B.id = A.id and B.age > 40 ), A.column2 = ( select b.column2 from B where B.id = A.id and B.age > 40 ) |
|
返回顶楼 | |
发表时间:2008-05-14
小虫1313 写道 armorking 写道 oracle && mysql
update A set A.column1 = ( select b.column1 from B where B.id = A.id and B.age > 40 ), A.column2 = ( select b.column2 from B where B.id = A.id and B.age > 40 ) mysql没用过,所以不敢乱说 |
|
返回顶楼 | |
发表时间:2008-05-14
oracle && mysql :
update A set (c1,c2)=(select c1,c2 from B where id=a.id and age>40) where id in (select id from b where age>40) SQL2000: update a set column1=b.column1 ,column2=b.column2 from a ,b where a.id = b.id and b.age>40 |
|
返回顶楼 | |
发表时间:2008-05-14
armorking 写道 oracle
update A set A.column1 = ( select b.column1 from B where B.id = A.id and B.age > 40 ), A.column2 = ( select b.column2 from B where B.id = A.id and B.age > 40 ) 我基本上思路跟这个一样,想不出mysql跟oracle有什么不一样 update A set A.column1 = ( select b.column1 from B where B.id = A.id and B.age > 40 ), A.column2 = ( select b.column2 from B where B.id = A.id and B.age > 40 ) where A.id=B.id and B.age>40 因为是A,B相应记录,所以我加上了where条件。 感觉好别扭。 |
|
返回顶楼 | |
发表时间:2008-05-15
mysql 要用inner join
|
|
返回顶楼 | |
发表时间:2008-05-15
aimer311 写道 armorking 写道 oracle
update A set A.column1 = ( select b.column1 from B where B.id = A.id and B.age > 40 ), A.column2 = ( select b.column2 from B where B.id = A.id and B.age > 40 ) 我基本上思路跟这个一样,想不出mysql跟oracle有什么不一样 update A set A.column1 = ( select b.column1 from B where B.id = A.id and B.age > 40 ), A.column2 = ( select b.column2 from B where B.id = A.id and B.age > 40 ) where A.id=B.id and B.age>40 因为是A,B相应记录,所以我加上了where条件。 感觉好别扭。 where条件是必须的 不加条件的话,A表中的所有记录都会被更新 对于A中不满足A.id=B.id and B.age>40条件的记录而言, column1和column2会被更新为null 不过where条件可以用IN或者EXISTS的形式 如 方式一 where A.id in (select B.id from B where B.id = A.id and B.age > 40) 或者 方式二 where exists (select 1 from B where B.id = A.id and B.age > 40) 当然直接用如下形式的条件也是可以的 方式三 where A.id = (select 1 from B where B.id = A.id and B.age > 40) 不过,方式三的情况下,当B中存在重复id的时候,可能会报ora-01427错误, 因为这种方式会要求作为条件值的子查询只有一个返回值 所以,子查询中还应当加上distinct或者rownum=1这样的限制 再参照ls的合并更新项目的做法,sql文如下 update A set (A.column1, A.column2) = ( select B.column1, B.column2 from B where B.id = A.id and B.age > 40 and rownum = 1 ) where exists ( select B.id from B where B.id = A.id and B.age > 40 ) 以下是测试用的建表语句 create table A ( id varchar2(1), column1 varchar2(1), column2 varchar2(1) ) / create table B ( id varchar2(1), column1 varchar2(1), column2 varchar2(1), age number ) / delete from A; insert into A(id, column1, column2) values ('1', '1', '1'); insert into A(id, column1, column2) values ('1', '1', '1'); insert into A(id, column1, column2) values ('2', '2', '2'); insert into A(id, column1, column2) values ('3', '3', '3'); delete from B; insert into B(id, column1, column2, age) values ('1', 'X', 'X', 41); insert into B(id, column1, column2, age) values ('2', 'X', 'X', 21); insert into B(id, column1, column2, age) values ('3', 'X', 'X', 51); insert into B(id, column1, column2, age) values ('3', 'Y', 'Y', 51); commit; ps:我个人认为,把这个问题作为面试题,并不见得合适 |
|
返回顶楼 | |
发表时间:2008-05-15
效率最高的方式:
MySQL: update a inner join b on a.id=b.id set A.column1 =b.column1,a.column2=b.column2 where b.age>40; |
|
返回顶楼 | |