Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 ADO.NET JavaScript LINQ AjaxPro DataGridView 面向对象 Extjs GridView XML DevExpress HTML教程 Oracle jQuery 分页 Prototype教程 GDI+ Visual C++2010 MySQL Office2010 WPF MVC Dojo WCF4.0 VB.NET Sql2005 textbox cookie WCF WinForm Discuz!NT SQL经典语句 T-SQL checkbox ASPxGridView F# asp.net SQL VS2008新特性 DropDownList Access TreeView Ajax VS2008 页面执行时间 Flex 字符串 回调 VB2005 DataSet C#时间 ASP.NET性能优化 用户在线检测
SQL Server Oracle Access MySQL
当前位置: 主页 > 数据库 > SQL Server >

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

时间:2010-07-29 10:00来源:未知 作者:admin 点击:

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=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

(责任编辑:admin)
Tags:关联
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价