【问题标题】:SQL Server insert update from two tablesSQL Server 从两个表插入更新
【发布时间】:2013-07-30 21:02:26
【问题描述】:

我有 2 个表格 Winner 和 player ,包含标准信息(姓氏、名字、ID ...)加上两个布尔列 Validity 和 WinnerState(默认为 0)。

我想做的是创建一个 SQL Server 过程,该过程将从玩家表中随机选择一条记录,然后将其插入到获胜者表中,并同时更新玩家表中选择的记录的获胜者状态列。

Winner 表包含一个指向 Player 的外键,用于跟踪所选玩家。

我已经尝试过一个程序,但它会为所有玩家表更新此列:

create procedure selectUpdate
    As
    insert into Winner (Fname,Lname,Adress,City,Tel,Player_ID) from
    select TOP 1 (Fname,Lname,Adress,City,Tel,ID) from Player order by NEWID()
    Update Player
    SET WinnerState=1

我怎样才能让它只更新随机选择的记录?谢谢!

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    您可以在一个语句中完成所有操作:

    create procedure selectUpdate
    as
    begin
        set nocount on
    
        ;with p as (
           select top 1 Fname,Lname,Adress,City,Tel,ID,WinnerState
           from Player
           where WinnerState = 0 -- this is necessary I assume
           order by checksum(NEWID())
        )
        update p
        set WinnerState = 1
        output
            inserted.Fname,
            inserted.Lname,
            inserted.Adress,
            inserted.City,
            inserted.Tel,
            inserted.ID into Winner (Fname,Lname,Adress,City,Tel,Player_ID)
    end
    

    【讨论】:

      【解决方案2】:

      假设 ID 是一个 INT 并且是 Player 表的主键:

      DECLARE @id INT
      
      SELECT TOP 1 @id = ID FROM Player ORDER BY NEWID()
      
      insert into Winner (Fname,Lname,Adress,City,Tel,Player_ID) from
      select Fname,Lname,Adress,City,Tel,ID from Player WHERE ID = @id
      
      Update Player
      SET WinnerState=1 WHERE ID = @id
      

      【讨论】:

      • 这一切都解决了,谢谢...没有考虑过声明一个临时值以从两个表中转换出色的工作。
      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 2014-01-03
      • 2021-04-29
      • 1970-01-01
      • 2015-04-08
      • 2011-02-16
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多