变量表更新案例

时间:2011-01-26 13:50:39

标签: sql sql-server-2008

我有(本例简化)TableA,包含Id,Speed和Description字段。 TableB包含对TableA的修改。表B包含Id(FK因此将匹配TableA中的Id),ModifiedSpeed和OriginalSpeed字段。

基本上,我希望能够根据TableB是否有与TableA相关的记录在一个语句中更新TableA Speed或TableB OriginalSpeed。

这是我到目前为止所尝试的内容,希望它会让我知道我想要什么,因为我不确定我是否能很好地解释它:

SELECT a.Id, a.Description, a.Speed, CASE 
    WHEN EXISTS(SELECT b.Id FROM TableB b WHERE b.Id = a.Id) THEN
        UPDATE TableB SET OriginalSpeed = 
            CASE
                WHEN (a.Speed is not null) THEN a.Speed
                WHEN a.Description = 'Motorway' THEN 70
                WHEN a.Description = 'A Road' THEN 60
                ELSE 30
            END
    ELSE
        UPDATE TableA SET Speed =
            CASE
                WHEN (a.Speed is not null) THEN a.Speed
                WHEN a.Description = 'Motorway' THEN 70
                WHEN a.Description = 'A Road' THEN 60
                ELSE 30
            END
END
FROM TableA a

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

您无法使用一个语句更新两个表。

答案 1 :(得分:2)

正如其他人所说的那样,有两个陈述。

UPDATE
    b
SET
    OriginalSpeed = CASE
                WHEN (a.Speed is not null) THEN a.Speed
                WHEN a.Description = 'Motorway' THEN 70
                WHEN a.Description = 'A Road' THEN 60
                ELSE 30
            END
FROM
    TableB b
        inner join
    TableA a
        on
            b.Id = a.Id

UPDATE
    a
SET
    Speed = CASE
                WHEN (a.Speed is not null) THEN a.Speed
                WHEN a.Description = 'Motorway' THEN 70
                WHEN a.Description = 'A Road' THEN 60
                ELSE 30
            END
FROM
    TableA a
        left join
    TableB b
        on
           a.ID = b.ID
WHERE
    b.ID is null

第一个查询仅在表A和表A之间的连接时有效。 B有效(因此A& b中的行之间存在匹配)。第二个查询,使用LEFT JOIN和where子句只更新A中的行,我们在B中找不到匹配的行。

答案 2 :(得分:1)

你应该做这样的事情(我猜你的数据类型):

Create Proc dbo.usp_ProcedureName

@Id int,
@Speed int

As Begin


If Exists (Select ID From TableB Where Id = @Id)
    Begin

        Update TableB
        Set OriginalSpeed = @Speed
        Where Id = @Id


    End
Else
    Begin

        Update TableA
        Set Speed = @Speed
        Where Id = @Id

    End



End
Go

您应该将ID和新速度作为参数传递给存储过程。然后,SP应该只更新这些值。即,在将值传递给存储过程之前,应该先确定决定速度等的逻辑。

如果表中存在Id,那么它将更新TableB,否则它将更新TableA