SQL菜鸟求助:在表和表之间传递数据
如A、B两个表 现在需要把表A中的字段a1=表B中的字段b1 条件为两表中a2,b2字段内容相同。 我用update命令做不成功,可能命令格式有误 update A set a1=(select B.b1 from A,B where A.a1=B.b1); 清帮忙改正下,多谢!
请学长参考下面的写法(SYBASE): update A set a1 = B。b1 from A,B where A。a2=B。b2; 学长的写法存在一定的错误。因为在括号之中的SQL,可能返回一个结果集,返回不止一个值,所以更新会不成功! -------------------------- PS:楼下一片叶子学姐提醒的是,关于更新时一对一的关系比较严谨,我也未充分考虑(where条件没仔细看,写成a1和b1了,现已更正)。
不过,上面的写法,语法上是正确的,UPDATE也可以成功。即使关联条件存在着一对多的关系也是如此,只不过,更新成功之后的数据,使用的多表中的逻辑第一条记录字段中的数据(多对多也是如此)。不过,也可以附加一些条件,来保证这种关系。(实际中,我做了一个A表一条记录,一个B表多条记录,SYBASE是成功的,SQL SERVER不好说。
上面的话中,关于结果集的说法,也有点问题,和LZ所犯的错误,性质相同哈!) 另外,如果是多对一的更新,则多记录表中的更新字段都被更新为相同的值。 当然,SYBASE现在不支持TOP 1这样的语法,学姐使用TOP 1的语法,是想保证一对一的关联,是这样的意思吧? -------------------------- 又PS: 还好,机器中有ORACLE环境,稍微测试了一下。
在ORACLE中的UPDATE语法中,首先不支持直接使用FROM,但是可以将FROM放在子查询之中。而且SET语法中的值,必须是唯一的,如果子查询中返回多行多个结果,肯定是不允许的。 下面的语法,是在LZ的数据,如果是一对一(包括可以使用distinct的重复)的关系,是可以正确执行的ORACLE语法,但是如果单纯依靠a2和b2相等,而产生不是一对一(同上)的关系,那么更新是不成功的! 所以建议LZ适当增加一个限制条件,以达到更新目的。
//假定b1如果有相同值的重复,但是用distinct可以去除这种重复,但是如果B。b1有不同的值,那么distinct也是没用的 update A set a1 =(select distinct b1 from B where a2 = A。
b2) where exists (select 1 from B where b2 = A。a2); //将A。a1 更新为子查询结果集中的第一个B。b1值,这个可能不是LZ所需要的效果,这个语句由于rownum,所以不怕有重复 update A set bb = ( select from A,B where = and rownum =1) ;。
关键是你的条件写错了. 天涯的条件也写错了.是不是可以用top 1 避免 update A set a1=(select top 1 B.b1 from A,B where A.a2=B.b2) update A set a1 = B.b1 from A,B where A.a2=B.b2
答:不知道你是不是写错文件名了,pdf?详情>>
答:当电脑的全部组件(包括软件)我们国家都能生产的时候。详情>>