日期:2014-05-19  浏览次数:20689 次

[重发 再加50分 共150 ]---异表批量更新字段值-----难题
看来朋友们没看懂问的,我重发一下,这回给数据
===============================
建了一个tablea表,
字段名 类型
----------------
aid nchar(10)
-----------------
aname nchar(50)
------------------

自动生成数据
-------------

DECLARE @I INT

DECLARE @ENDID INT

SELECT @I = 0

SELECT @ENDID = 200 --在此处更改要插入的数据,重新插入之前要删掉所有数据

WHILE @I <= @ENDID

BEGIN

  INSERT INTO tablea

  SELECT 'AB'+CAST(@I AS VARCHAR(10))+'EF','B-'+CAST(@I AS VARCHAR(10))

  SELECT @I = @I + 1

END

=================
建了一个tableb表,
字段名 类型
----------------
bid nchar(10)
-----------------
bname nchar(10)
------------------
bcontext nchar(80)
-------------------

填加数据

DECLARE @I INT

DECLARE @ENDID INT

SELECT @I = 300

SELECT @ENDID = 600 --加300条哦

WHILE @I <= @ENDID

BEGIN

  INSERT INTO tableb

  SELECT 'AB'+CAST(@I AS VARCHAR(10))+'EF','B-'+CAST(@I AS VARCHAR(10)),'iuuiok'

  SELECT @I = @I + 1

END

------------------
好了,现在tablea中有了200条数据,tableb中有300数据,并且它们字段数不同(一个有2,一个有3个)

我想实现用tableb中的第50-250条数据的bid 值 来 更新 tablea中的200条数据aid值


我自己试着写的 update tablea set aid = bid from tableb where bid in (select top 200 bid from tableb)
结果:所有的tablea中的aid字段的值是 'AB300EF'{这是tableb中bid字段中的第一个记录的值},我错哪了呢?为什么不是一对一的呢?

这次应该我是说明白我的问题了,希望高手给解决一下。
这贴是50+100{100分在下贴中,是一个问题}
http://topic.csdn.net/u/20090408/23/882b15fd-23ec-467a-9259-9ec7fb471663.html?seed=452852627


------解决方案--------------------
探讨
非得修改原表吗?非得添加字段吗?哎,那不会遍历效率高了

------解决方案--------------------
SQL code
;WITH Liang AS
(
    SELECT *,rnk=ROW_NUMBER() OVER(ORDER BY GETDATE())
    FROM tablea
)
UPDATE Liang SET aid=b.bid
FROM (
    SELECT
        *,rnk=ROW_NUMBER() OVER(ORDER BY GETDATE())
    FROM tableB
) AS B
WHERE B.rnk BETWEEN 50 AND 250
    AND Liang.rnk=B.rnk