2011-01-26 68 views
0

我有(简化了这个例子)带有Id,Speed和Description字段的TableA。 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 

任何帮助,将不胜感激。

+0

在select语句的中间不能有更新语句,您可以不使用case语句来切换要更新的表。您是否使用存储过程来更新数据?你想创建某种审计表吗? – codingbadger 2011-01-26 13:59:49

+0

@Barry:我正在使用存储过程进行更新是的,虽然我仍然在努力解决局限性和最佳做法,但我对Sql并不擅长。 TableA是道路链接,但对项目的要求是最终用户可以修改速度,并且如果修改了速度,则当运行导出存储过程时不会更新TableA值,但速度修改表中的原始值(TableB )是,如果它没有被修改,TableA速度值应该更新为 – Manatherin 2011-01-26 14:06:36

回答

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 & B工作(因此是在一个& B中的行之间的匹配)。第二个查询使用LEFT JOIN和where子句只更新A中的行,我们在B中找不到匹配的行。

2

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

+0

+1。存储过程在这里听起来最好,或者至少有一些更复杂的代码在执行选择,然后执行富有的插入。请注意,您可以在一个批处理(即执行一个命令)中提交该命令,而不是一个sql语句(一个命令执行可以执行多个命令)。 – TomTom 2011-01-26 13:59:13

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中存在,那么它会更新表B否则将更新表A

+0

我不知道该如何用速度逻辑来调用它,基本上我想用TableA中的每个项目运行这个速度基于关闭描述,想知道是否可以帮助我确定从哪里开始?谢谢 – Manatherin 2011-01-26 14:40:22