T-SQL 学习(一)

来源:互联网 发布:个人淘宝店要交税吗 编辑:程序博客网 时间:2024/05/16 10:37

月初修改一个SQL语句,确保接口传递的产品数据对应的种类都在相关店铺的种类表里。这里碰到了一个问题,数据库有两张关联表,[Product.Class]存储了系统中所有的产品种类,[Product.ShopClass]存储了店铺中所有的产品种类,但是存的却是种类名,而不是[Product.Class]的主键,后来又加了一列,需要填充对应的ClassID。前期设计不合理,不规范,后期后患无穷啊。

在这里记录一下实现的方式。

第一种使用公用表表达式CTE,这种方式简单明了,我很喜欢。

WITH T AS (SELECT a.ID,a.ClassID,b.ClassID AS ClassIDx FROM [Product.ShopClass] aLEFT JOIN [Product.Class] b ON b.ClassName = a.ClassName)UPDATE T SET ClassID = ClassIDx
另附两种实现方式,主要是为了复习一下表变量和游标。

表变量

DECLARE @i int,@count int,@id int,@classId int;DECLARE @t TABLE (Num int,Id int,ClassId int)INSERT INTO @t SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID) AS Num,a.ID,b.ClassId FROM [Product.ShopClass] a LEFT JOIN [Product.Class] b ON b.ClassName = a.ClassName) AS tSET @i=0SELECT @count=count(*) FROM @tWHILE @i < @countBEGINSELECT @id=Id,@classId=ClassId FROM @t WHERE Num=@iUPDATE [Product.ShopClass] SET ClassId = @classId WHERE ID = @idSET @i = @i + 1END
游标
DECLARE @id int,@name varchar(50)DECLARE C CURSOR FAST_FORWARD FOR SELECT a.ID,b.ClassId [Product.ShopClass] a LEFT JOIN [Product.Class] b ON b.ClassName = a.ClassNameOPEN CFETCH next FROM C INTO @id,@classIdWHILE @@FETCH_STATUS = 0BEGIN UPDATE [Product.ShopClass] SET ClassId = @classId WHERE ID = @id FETCH next FROM C INTO @id,@classIdEND CLOSE CDEALLOCATE C 

 



原创粉丝点击