• 利用带关联子查询Update语句更新数据


     Update是T-sql中再简单不过的语句了,update table set column=expression  [where condition],我们都会用到。但update的用法不仅于此,真正在开发的时候,灵活恰当地使用update可以达到事半功倍的效果。

          假定有表Table1(a,b,c)和Table2(a,c),现在Table1中有些记录字段c为null,要根据字段a在Table2中查找,取出字段a相等的字段c的值来更新Table1。一种常规的思路,通过游标遍历Table1中字段c为null的所有记录,在循环体内查找Table2并进行更新,即用游标Cursor的形式。测试sql语句如下:

     --1.创建测试表
        create TABLE Table1
        (
            a varchar(10),
            b varchar(10),
            c varchar(10),
            CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
            (
                a ASC
            )
        ) ON [PRIMARY]
    
        create TABLE Table2
        (
            a varchar(10),
            c varchar(10),
            CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
            (
                a ASC
            )
        ) ON [PRIMARY]
        GO
        --2.创建测试数据
        Insert into Table1 values('','asds',null)
        Insert into Table1 values('','asds','100')
        Insert into Table1 values('','asds','80')
        Insert into Table1 values('','asds',null)
    
        Insert into Table2 values('','90')
        Insert into Table2 values('','100')
        Insert into Table2 values('','80')
        Insert into Table2 values('','95')
        GO
        select * from Table1
    
        --3.通过游标方式更新
        declare @name varchar(10)
        declare @score varchar(10)
        declare mycursor cursor for select a from Table1 where c is null
        open mycursor
        fetch next from mycursor into @name
        while(@@fetch_status = 0)
        BEGIN
            select @score=c from Table2 where a=@name
            update Table1 set c = @score where a = @name
            fetch next from mycursor into @name    
        END
        close mycursor
        deallocate mycursor
        GO
        --4.显示更新后的结果
        select * from Table1
        GO
        --5.删除测试表
        drop TABLE Table1
        drop TABLE Table2
    使用游标遍历方式更新

    虽然用游标可以实现,但代码看起来很复杂,其实用Update根据子关联来更新只要一条语句就可以搞定了,测试代码如下:

    --1.创建测试表
        create TABLE Table1
        (
            a varchar(10),
            b varchar(10),
            c varchar(10),
            CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
            (
                a ASC
            )
        ) ON [PRIMARY]
    
        create TABLE Table2
        (
            a varchar(10),
            c varchar(10),
            CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
            (
                a ASC
            )
        ) ON [PRIMARY]
        GO
        --2.创建测试数据
        Insert into Table1 values('','asds',null)
        Insert into Table1 values('','asds','100')
        Insert into Table1 values('','asds','80')
        Insert into Table1 values('','asds',null)
    
        Insert into Table2 values('','90')
        Insert into Table2 values('','100')
        Insert into Table2 values('','80')
        Insert into Table2 values('','95')
        GO
        select * from Table1
    
        --3.通过Update方式更新
        Update Table1 set c = (select c from Table2 where a = Table1.a) where c is null
        GO
    
        --4.显示更新后的结果
        select * from Table1
        GO
        --5.删除测试表
        drop TABLE Table1
        drop TABLE Table2
    使用带关联子查询的Update更新
  • 相关阅读:
    Linux更新时,出现无法更新锁
    Linux显示su:认证失败
    08 redis的缓存预热,雪崩,击穿,穿透问题以及常用的监控参数
    06 redis的哨兵系统的工作流程
    05 redis的主从复制机制的工作流程以及相关基础知识
    03 redis的事务以及锁、过期数据的删除策略、逐出算法、配置文件的核心配置参数
    02 jedis以及redis的持久化
    01 redis的5种基本数据类型的介绍,使用以及应用场景
    M1 MySQL事务知识点的总结
    02 Java文件读写通道的使用以及文件的基本操作方法
  • 原文地址:https://www.cnblogs.com/lishuangjiang/p/3549065.html
Copyright © 2020-2023  润新知