2010-09-14 75 views
2

我意識到我所要求的可能是不可能的。我想根據LEFT JOIN和WHERE子句在兩個單獨的表上執行UPDATE。這是我的嘗試:使用左連接更新單個更新語句中的多個表格

UPDATE PERIODDATES as pd, periods2 as p2 
SET  pd.[PERIODCODE] = @PERIODCODE, 
    p2.[USERCODE] = @USERCODE 
      left join periods2 AS p2 
    ON pdates.schemeid = p2.schemeid AND 

WHERE [SCHEMEID] = @SCHEMEID 

這可能嗎?

回答

4

這是不可能的。您只能在一個語句中更新一個表。你將不得不將這個分成兩個語句。

編輯:

在一個語句更新兩個表實際上是可能的,但需要使用UNION同時包含要更新的表創建一個視圖。然後,您可以更新View,然後更新基礎表。

這對我來說似乎有些破綻,但它會起作用。

+0

我同意這看起來有點像一個黑客,認爲我會分開聲明等待任何其他答案。任何原因爲什麼這是不可能的呢?它似乎應該是。 – 2010-09-14 11:30:22

2

在這裏恢復一個老問題,但是......您可以模擬通過包含在事務中的兩個UPDATE查詢在單個查詢中更新多個表。這樣,您就不必變得混亂使用上確定年代的觀點,沒有變化將作出,除非這兩個表成功更新:

BEGIN TRANSACTION 

UPDATE PERIODDATES AS pd 
SET pd.PeriodCode = @PeriodCode 
WHERE [SCHEMEID] = @SCHEMEID; 

UPDATE periods2 AS pd2 
SET pd2.[USERCODE] = @USERCODE 
WHERE [SCHEMEID] = @SCHEMEID; 

COMMIT; 

你的插入,你可以使用@@ IDENTITY,或輸出轉換到搶在第二個表中使用的新記錄的編號,即:

DECLARE @ID int; 

BEGIN TRANSACTION 

INSERT INTO PERIODDATES(PeriodCode) AS pd 
VALUES (@PeriodCode) 
WHERE [SCHEMEID] = @SCHEMEID; 

SELECT @ID = @@IDENTITY; 

INSERT INTO periods2([SCHEMEID], [USERCODE]) AS pd2 
VALUES (@ID, @USERCODE); 

COMMIT;