这个sql怎么写

[复制链接]
查看11 | 回复9 | 2007-6-18 09:23:37 | 显示全部楼层 |阅读模式
两个表:t1(a1,b1)

t2(a2,b2)
现在要根据b2=b1的匹配条件,将t2中的a2改成对应的t1的a1列的值。
请教sql怎么写,最好提供oracle和sqlserver中都能用的语句
回复

使用道具 举报

千问 | 2007-6-18 09:23:37 | 显示全部楼层
update yourtable set t2.a2=t1.a1 where t2.b2=t1.b1;
回复

使用道具 举报

千问 | 2007-6-18 09:23:37 | 显示全部楼层

回复

使用道具 举报

千问 | 2007-6-18 09:23:37 | 显示全部楼层
update t2 a set a2 = (select a1 from t1 where b1 = a.b2);
回复

使用道具 举报

千问 | 2007-6-18 09:23:37 | 显示全部楼层
如果
select a1 from t1 where b1 = a.b2
返回多行记录的话,无法更新。
回复

使用道具 举报

千问 | 2007-6-18 09:23:37 | 显示全部楼层
http://zhouwf0726.itpub.net/post/9689/205013
回复

使用道具 举报

千问 | 2007-6-18 09:23:37 | 显示全部楼层
最初由 kso 发布
[B]update t2 a set a2 = (select a1 from t1 where b1 = a.b2); [/B]

这个可以!
回复

使用道具 举报

千问 | 2007-6-18 09:23:37 | 显示全部楼层
最初由 zhouwf0726 发布
[B]http://zhouwf0726.itpub.net/post/9689/205013 [/B]

总结的太好了,有数据很有说服性。看来我在生产库上执行没有带exists的是很危险的啊!学习了!
回复

使用道具 举报

千问 | 2007-6-18 09:23:37 | 显示全部楼层
我把zhou的转出来了,大家看着更直观。
今天给一个同事调试SQL,做个记录。
CREATE TABLE TEST1(ID VARCHAR2(20) NOT NULL PRIMARY KEY,
MC VARCHAR2(60));
CREATE TABLE TEST2(ID VARCHAR2(20) NOT NULL PRIMARY KEY,
MC VARCHAR2(60));
INSERT INTO TEST1 VALUES('1','1-11111');
INSERT INTO TEST1 VALUES('2','1-22222');
INSERT INTO TEST1 VALUES('3','1-33333');
INSERT INTO TEST2 VALUES('1','2-11111');
INSERT INTO TEST2 VALUES('2','2-22222');
UPDATE (SELECT A.MC MCA,B.MC MCB FROM TEST1 A,TEST2 B WHERE A.ID=B.ID) SET MCA=MCB;
/*
2 rows updated
这个写法要求TEST2表要有主建,否则SQL无法执行!
ORA-01779: 无法修改与非键值保存表对应的列
*/
SELECT * FROM TEST1;
/*
ID MC
-------------------- -------------------
1 2-11111
2 2-22222
3 1-33333
*/
ROLLBACK;
UPDATE TEST1 A SET MC = (SELECT MC FROM TEST2 B WHERE A.ID=B.ID) WHERE EXISTS (SELECT ID FROM TEST2 B WHERE A.ID=B.ID);
/*
2 rows updated
如果不加后边的where则是update 3条数据的,没有对于ID的则被更新为空
*/
SELECT * FROM TEST1;
回复

使用道具 举报

千问 | 2007-6-18 09:23:37 | 显示全部楼层
没有写exists的话, TEST2中不存在的记录将直接update成null值..
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行