尝试更新具有相同数据值的列中的多个行 [英] Trying to update multiple rows in a column with same data value

查看:91
本文介绍了尝试更新具有相同数据值的列中的多个行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

I have a table that is keeping track of teams wins and lost throughout a season.

TeamRecordId____|___Won___|___Lost___|
                |         |          |
___1____________|_Rebels__|__Tigers__|
                |         |          |
___2____________|_Stars___|_Comets___|
                |         |          |
__3_____________|_Raptors_|_Mayhem___|


My Insert Stored Procedure works but I can't figure out how to do a Update Procedure.

Thanks, any help would be appreciated





我尝试过:



Insert Proc

ALTER PROCEDURE [dbo]。[InsertTeamRecord]



@Week nvarchar(20),

@ Game_1_Won nvarchar(20),

@ Game_1_Lost nvarchar(20),

@ Game_2_Won nvarchar (20),

@ Game_2_Lost nvarchar(20),

@ Game_3_Won nvarchar(20),

@ Game_3_Lost nvarchar(20)



AS





插入TeamRecord(周,赢,失去)

VALUES(@ Week,@ Game_1_Won,@ Game_1_Lost),(@ Week,@ Game_2_Won,@ Game_2_Lost),(@ Week,@ Game_3_Won,@ Game_3_Lost)

< br $>




更新程序:



没有丢失的CASE,因为我得到了每次我尝试在代码中放入丢失的CASE时都会出错。



ALTER PROCEDURE [dbo]。[UpdateTeamRecord]



@Week nvarchar(20),

@ Game_1_Won nvarchar(20),

@ Game_1_Lost nvarchar(20),

@ Game_2_Won nvarchar(20),

@ Game_2_Lost nvarchar( 20),

@ Game_3_Won nvarchar(20),

@ Game_3_Lost nvarchar(20)



AS



UPDATE TeamRecord SET Won = CASE WHEN赢了= @ Game_1_Won那么@ Game_1_Won

WHEN赢了= @ Game_2_Won然后@ Game_2_Won



What I have tried:

Insert Proc
ALTER PROCEDURE [dbo].[InsertTeamRecord]
(
@Week nvarchar(20),
@Game_1_Won nvarchar(20),
@Game_1_Lost nvarchar(20),
@Game_2_Won nvarchar(20),
@Game_2_Lost nvarchar(20),
@Game_3_Won nvarchar(20),
@Game_3_Lost nvarchar(20)
)
AS


INSERT INTO TeamRecord(Week, Won, Lost)
VALUES(@Week, @Game_1_Won, @Game_1_Lost),(@Week, @Game_2_Won, @Game_2_Lost),(@Week, @Game_3_Won, @Game_3_Lost)



Update Proc:

There is no Lost CASE because I get an error every time I try to put a Lost CASE in my code.

ALTER PROCEDURE [dbo].[UpdateTeamRecord]
(
@Week nvarchar(20),
@Game_1_Won nvarchar(20),
@Game_1_Lost nvarchar(20),
@Game_2_Won nvarchar(20),
@Game_2_Lost nvarchar(20),
@Game_3_Won nvarchar(20),
@Game_3_Lost nvarchar(20)
)
AS

UPDATE TeamRecord SET Won = CASE WHEN Won = @Game_1_Won THEN @Game_1_Won
WHEN Won = @Game_2_Won THEN @Game_2_Won

推荐答案

目前,没有办法编写合理的更新程序,因为无法识别哪个记录与哪个游戏有关。



您必须删除本周的数据,然后再次插入:
As it stands, there's no way to write a sensible update procedure, because there's no way to identify which record relates to which game.

You'll either have to delete the data for the week, and then insert it again:
ALTER PROCEDURE [dbo].[UpdateTeamRecord]
(
    @Week nvarchar(20),
    @Game_1_Won nvarchar(20),
    @Game_1_Lost nvarchar(20),
    @Game_2_Won nvarchar(20),
    @Game_2_Lost nvarchar(20),
    @Game_3_Won nvarchar(20),
    @Game_3_Lost nvarchar(20)
)
AS
BEGIN
    SET NOCOUNT ON;
    
    DELETE FROM TeamRecord WHERE Week = @Week;
    
    INSERT INTO TeamRecord(Week, Won, Lost)
    VALUES
        (@Week, @Game_1_Won, @Game_1_Lost),
        (@Week, @Game_2_Won, @Game_2_Lost),
        (@Week, @Game_3_Won, @Game_3_Lost)
    ;
END



或者,按ID对每周的行进行排序,并根据该值进行更新:


Or, sort the rows for the week by ID, and update based on that:

ALTER PROCEDURE [dbo].[UpdateTeamRecord]
(
    @Week nvarchar(20),
    @Game_1_Won nvarchar(20),
    @Game_1_Lost nvarchar(20),
    @Game_2_Won nvarchar(20),
    @Game_2_Lost nvarchar(20),
    @Game_3_Won nvarchar(20),
    @Game_3_Lost nvarchar(20)
)
AS
BEGIN
    SET NOCOUNT ON;
    
    WITH cteWeekRecords As
    (
        SELECT
            Id,
            ROW_NUMBER() OVER (ORDER BY Id) As GameNumber
        FROM
            TeamRecord
        WHERE
            Week = @Week
    ),
    cteNewRecords As
    (
        SELECT
            Id,
            CASE GameNumber
                WHEN 1 THEN @Game_1_Won
                WHEN 2 THEN @Game_2_Won
                WHEN 3 THEN @Game_3_Won
            END As Won,
            CASE GameNumber
                WHEN 1 THEN @Game_1_Lost
                WHEN 2 THEN @Game_2_Lost
                WHEN 3 THEN @Game_3_Lost
            END As Lost
        FROM
            cteWeekRecords
        WHERE
            GameNumber In (1, 2, 3)
    )
    UPDATE
        R
    SET
        Won = S.Won,
        Lost = S.Lost
    FROM
        TeamRecord As R
        INNER JOIN cteNewRecords As S
        ON S.Id = R.Id
    ;
END    


这篇关于尝试更新具有相同数据值的列中的多个行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆