2011-01-26 80 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