`

利用带关联子查询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根据子关联来更新只要一条语句就可以搞定了,测试代码如下:

使用带关联子查询的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语句更新数据的方法

    主要介绍了利用带关联子查询Update语句更新数据的方法,需要的朋友可以参考下

    SQL update 多表关联更新的实现代码

    实现多表更新,尤其是A表和A的子表B表数据更新,下面是例子 有A、B张表,其记录如下: A表 c1 c2 ————– 1 a1 2 a2 3 a3 8 a8 B表 c1 c3 ————– 1 b1 2 b1 3 b3 10 b10 A.c1与B.c1相等,用一条sql...

    深入浅出 SQL (中文版).part1

    本书甚至回答了那个老问题:如何讲解无关联子查询而不会因此失去活下去的愿望?本书是正确的学习途径——快速、活泼,而且看上去很酷。内容简介 你将从本书学到什么? 在如今的世界,数据就是力量,但是成功的真正...

    C#.net_经典编程例子400个

    74 实例064 利用选择控件实现复杂查询 76 2.7 ListView控件应用 78 实例065 ListView列表拒绝添加重复信息 78 实例066 将数据库数据添加到ListView控件 80 实例067 用ListView控件制作导航...

    经典SQL语句大全

    4、说明:子查询(表名1:a 表名2:b) select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 5、说明:显示文章、提交人和最后回复时间 select a.title,a.username,b....

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    T-SQL高级查询

    子查询是一个嵌套在select、insert、update或delete语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也成为外部查询或外部选择。 # ...

    程序员的SQL金典6-8

     8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中的应用 第9章 主流数据库的SQL语法差异解决方案  9.1 SQL语法差异分析  9.1.1 数据类型的差异  9.1.2 运算符的差异  9.1.3 函数的差异  9.1.4...

    程序员的SQL金典7-8

     8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中的应用 第9章 主流数据库的SQL语法差异解决方案  9.1 SQL语法差异分析  9.1.1 数据类型的差异  9.1.2 运算符的差异  9.1.3 函数的差异  9.1.4...

    程序员的SQL金典3-8

     8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中的应用 第9章 主流数据库的SQL语法差异解决方案  9.1 SQL语法差异分析  9.1.1 数据类型的差异  9.1.2 运算符的差异  9.1.3 函数的差异  9.1.4...

    程序员的SQL金典4-8

     8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中的应用 第9章 主流数据库的SQL语法差异解决方案  9.1 SQL语法差异分析  9.1.1 数据类型的差异  9.1.2 运算符的差异  9.1.3 函数的差异  9.1.4...

    C#程序开发范例宝典(第2版).part13

    实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...

    C#程序开发范例宝典(第2版).part08

    实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...

    C#程序开发范例宝典(第2版).part02

    实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...

    C#程序开发范例宝典(第2版).part12

    实例067 利用选择控件实现复杂查询 85 2.6 ListView控件应用 87 实例068 ListView控件间的数据移动 87 实例069 将数据库数据添加到ListView控件 90 实例070 在ListView控件中实现修改功能 91 实例071 在...

Global site tag (gtag.js) - Google Analytics