论坛首页 招聘求职论坛

早上面试的一道数据库问题,请教怎么做

浏览 23809 次
精华帖 (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两个版本。
不知道怎么写。
   发表时间: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
    )
0 请登录后投票
   发表时间:2008-05-14  
update a set column1=b.column1 ,column2=b.column2 from a ,b where a.id = b.id and b.age>40
0 请登录后投票
   发表时间: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
    )

0 请登录后投票
   发表时间: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没用过,所以不敢乱说
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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条件。
感觉好别扭。
0 请登录后投票
   发表时间:2008-05-15  
mysql 要用inner join
0 请登录后投票
   发表时间: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:我个人认为,把这个问题作为面试题,并不见得合适
1 请登录后投票
   发表时间: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;
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics