请数据库高手给解答一下 UPDATE FROM 语句在SQL2000和SQL2005下执行结果居然不一样

来源:百度知道 编辑:UC知道 时间:2024/06/05 17:23:25
有两个表TEST1和TEST2,TEST1和TEST2的数据结构是一致的,都有两个字段A,B,
现在我要用TEST1的B字段的值去更新TEST2的B字段,SQL语句为:
update test2 set b=y.b from test2 x,test1 y where x.a=b.a
在SQL2000下,该语句能正常执行,并得到正确的结果,但是在SQL2005下,该语句被转换成:UPDATE test2 SET b = y.b FROM test2 AS x INNER JOIN test2 ON x.a = test2.a CROSS JOIN test1 AS y 得到的结果完全不正确 希望数据库高手给解答一下
是笔误:应该是....WHERE X.A=Y.A
结果还是不对 语句被转换成:
UPDATE test2
SET b = y.b FROM test2 AS x LEFT OUTER JOIN test1 AS y ON x.a = y.a CROSS JOIN test2
奇怪的是SQL2000下一点问题也没有

update test2 set b=y.b from test2 x,test1 y where x.a=b.a
你这句肯定是错的,最后那里的x.a=b.a,b是列,b.a能正确?

那你试试这样:
UPDATE test2 SET b = y.b FROM test2 AS x LEFT JOIN test1 AS y ON x.a = y.a

游标法(再不行我也没辙):
DECLARE @a varchar(10) --这里的类型要换成跟你的a字段的类型一样的
DECLARE @b varchar(10) --这里的类型要换成跟你的b字段的类型一样的
DECLARE bCursor CURSOR FOR
SELECT a,b FROM test1
OPEN bCursor
FETCH NEXT FROM bCursor INTO @a,@b
WHILE @@fetch_status = 0
BEGIN
UPDATE test2 SET b=@b where a=@a
FETCH NEXT FROM bCursor INTO @a,@b
END
CLOSE bCursor
DEALLOCATE bCursor

update TEST2 B set b.b=(select a.b from TEST1 a where A.a=B.a)

数据库中查询重写策略的问题,SQL2005中SQL的优化方法与2000不同,你可以在ORACLE中再执行一下,看看 执行策略是什么样