2013-02-27 80 views
12

我使用的是SQL Server和嘗試使用SQL一次更新多個表用一個查詢:更新多個表使用INNER JOIN

下面的查詢:

update table1 
set A.ORG_NAME = @ORG_NAME, B.REF_NAME = @REF_NAME 
from table1 A, table2 B 
where B.ORG_ID = A.ORG_ID 
and A.ORG_ID = @ORG_ID 

給人的錯誤消息:

無法綁定多部分標識符「A.ORG_NAME」。

錯誤信息是什麼意思?

+2

失敗如何?錯誤信息?只是沒有更新你想要的? – 2013-02-27 15:22:59

+4

'請更新',請不要寫舊式連接。使用適當的'INNER JOIN'語法。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx – 2013-02-27 16:08:39

回答

20

您不能更新更多的是在單個語句一個表,但是你得到的錯誤信息是因爲別名,你可以試試這個:

BEGIN TRANSACTION 

update A 
set A.ORG_NAME = @ORG_NAME 
from table1 A inner join table2 B 
on B.ORG_ID = A.ORG_ID 
and A.ORG_ID = @ORG_ID 

update B 
set B.REF_NAME = @REF_NAME 
from table2 B inner join table1 A 
    on B.ORG_ID = A.ORG_ID 
    and A.ORG_ID = @ORG_ID 

COMMIT 
+0

謝謝。在'commit'後面加上關鍵字'end'是一個好習慣嗎?或者沒有必要? – Coyolero 2013-02-27 15:48:53

+3

* BEGIN TRANSACTION *與啓動塊的* BEGIN *不同(例如,在* IF *中使用)。所以不要使用* END *,這不是一個好的或不好的練習的問題,你可能會關閉你所在的程序塊,並找到意想不到的輸出 – jazzytomato 2013-02-27 15:55:18

10

您可以用加入,如果更新你隻影響一個表像這樣:

UPDATE table1 
SET table1.name = table2.name 
FROM table1, table2 
WHERE table1.id = table2.id 
AND table2.foobar ='stuff' 

但你試圖影響與對多個表的連接更新語句的多個表。這是不可能的。

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

SQL JOINS

但是這是一個非常哈克店招,使用事務和多次更新,它更加直觀。

+3

你的粗體語句不完全正確。您可以基於連接來更新表,但您無法更新*影響*多個表。我同意關於建議鏈接的黑客入侵(我甚至可能會建議刪除它)。爲避免寫兩個陳述真的值得做嗎? – 2013-02-27 15:50:01

+0

該鏈接沒有描述如何使用聯合,也許它是來自該博客的另一篇文章? – 2016-07-20 03:48:49