我有(本例简化)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
任何帮助都将不胜感激。
答案 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