none
求教高手关于update语句 RRS feed

  • 问题

  • a 表 

    a1(PK)      a2           a3         a4

    1            null          null       null

    2            null          null       null

    3           null           null       null

    b表

    b1     b2           b3          b4          b5(pk)

    1         v           c             d            A

    2        d           v             d             B

    3        c            d             r              C

    3         c           d             w            D

    3        c           d               x            E

    现在想做的是把b表的数据更新到a表中,但问题是两个表的PK不同,因此我想实现的是把b表的数据按a表中已存在的行依pk更新来自b表的ORDER BY DESC TOP1 PK数据,要求UPDATE执行后效果如下  ,谢谢!

    a 表 

    a1(PK)      a2           a3         a4

    1            v                c            d

    2           d                 v           d

    3           c                d             x


    • 已编辑 hzpemu 2012年4月25日 6:55
    2012年4月25日 6:55

答案

  • UPDATE A SET
    	a.a2 = b.b2
    	a.a3 = b.b3,
    	a.a4 = b.b4
    FROM a表 A
    	CROSS APPLY(
    		SELECT TOP 1 *
    		FROM B表 B
    		WHERE A.PK = B.b1
    		ORDER BY b.b5 DESC
    	)B	
    

    • 已标记为答案 hzpemu 2012年4月25日 8:17
    2012年4月25日 7:05
  • B表的 B这个别名, 代表的是B表

    最后面这个别名B, 代表 的是 CROSS APPLY 这个查询结果

    • 已标记为答案 hzpemu 2012年4月25日 8:16
    2012年4月25日 7:52
  • 非常感谢,测试通过,代码以下

    update it_resource
          set it_resource.sAssetName=t2.sAssetName,it_resource.sCardID=t2.sCardID
           from it_resource as t1
           CROSS APPLY(
    SELECT TOP 1 *
    FROM fa_cards t2
        WHERE t1.sAssetNum=t2.sAssetNum
    ORDER by sCardID DESC
    ) t2

    • 已标记为答案 hzpemu 2012年4月25日 8:16
    2012年4月25日 8:16

全部回复

  • UPDATE A SET
    	a.a2 = b.b2
    	a.a3 = b.b3,
    	a.a4 = b.b4
    FROM a表 A
    	CROSS APPLY(
    		SELECT TOP 1 *
    		FROM B表 B
    		WHERE A.PK = B.b1
    		ORDER BY b.b5 DESC
    	)B	
    

    • 已标记为答案 hzpemu 2012年4月25日 8:17
    2012年4月25日 7:05
  • 不好意思,你的代码里

    FROM a A 和

    FROM B B

    我没看懂,

    最后一行还有一个

    )B

    也不是很明白,能说明一下吗?

    2012年4月25日 7:47
  • B表的 B这个别名, 代表的是B表

    最后面这个别名B, 代表 的是 CROSS APPLY 这个查询结果

    • 已标记为答案 hzpemu 2012年4月25日 8:16
    2012年4月25日 7:52
  • 非常感谢,测试通过,代码以下

    update it_resource
          set it_resource.sAssetName=t2.sAssetName,it_resource.sCardID=t2.sCardID
           from it_resource as t1
           CROSS APPLY(
    SELECT TOP 1 *
    FROM fa_cards t2
        WHERE t1.sAssetNum=t2.sAssetNum
    ORDER by sCardID DESC
    ) t2

    • 已标记为答案 hzpemu 2012年4月25日 8:16
    2012年4月25日 8:16
  • 非常感谢,测试通过,代码以下

    update it_resource
          set it_resource.sAssetName=t2.sAssetName,it_resource.sCardID=t2.sCardID
           from it_resource as t1
           CROSS APPLY(
    SELECT TOP 1 *
    FROM fa_cards t2
        WHERE t1.sAssetNum=t2.sAssetNum
    ORDER by sCardID DESC
    ) t2

    2012年4月25日 8:16
  • declare @a table
    (
    	a1	int,
    	a2 varchar(10),
    	a3 varchar(10),
    	a4 varchar(10)
    )
    
    declare @b table
    (
    	b1	int,
    	b2 varchar(10),
    	b3 varchar(10),
    	b4 varchar(10),
    	b5 varchar(10)
    )
    
    insert into @a(a1) values (1),(2),(3)
    insert into @b values(1        ,'v'           ,'c'             ,'d'            ,'A')
    insert into @b values(2        ,'d'           ,'v'             ,'d'            ,'B')
    insert into @b values(3        ,'c'           ,'d'             ,'r'            ,'C')
    insert into @b values(3        ,'c'           ,'d'             ,'w'            ,'D')
    insert into @b values(3        ,'c'           ,'d'             ,'x'            ,'E')
    
    select *
    from @a
    
    
    update @a
    set a.a2 = b.b2,a.a3 = b.b3,a.a4 = b.b4
    from @a a
    inner join 
    (
    	select *
    	from @b
    	where b5 in (
    	select MAX(b5)
    	from @b
    	group by b1)
    ) b
    on a1 = b1
    
    select *
    from @a
    


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年4月25日 8:16