2013-02-27 17 views
12

Używam SQL Server i próbuje użyć SQL do aktualizacji wielu tabel na raz z jednego zapytania:Aktualizuj wielu tabel w SQL Server przy użyciu INNER JOIN

następujące zapytanie:

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 

daje komunikat o błędzie:

Nie można powiązać wieloczęściowego identyfikatora "A.ORG_NAME".

Co oznacza komunikat o błędzie?

+2

Nie udało się jak? Komunikat o błędzie? Po prostu nie aktualizujesz tego, czego chcesz? –

+4

"AKTUALIZUJ" na bok, proszę, proszę, przestańcie pisać łączenia w starym stylu. Użyj odpowiedniej składni "INNER JOIN". http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

Odpowiedz

20

Nie można zaktualizować więcej niż jednej tabeli w jednej instrukcji, jednak komunikat o błędzie można uzyskać z powodu aliasów, możesz spróbować tego:

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

Dzięki. Czy dobrą praktyką jest umieszczanie słowa kluczowego 'end' po' commit'? czy nie jest to konieczne? – Coyolero

+3

* BEGIN TRANSAKCJA * nie jest tym samym, co * BEGIN *, który uruchamia blok (używany na przykład w * IF *). Więc nie używaj * KONIEC *, to nie jest nawet pytanie o dobrą lub złą praktykę, możesz zamknąć blok, w którym jesteś, i znaleźć nieoczekiwane wyjście. – jazzytomato

10

można zaktualizować z przyłączyć jeśli tylko wpływa jedna tabela tak:

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

Ale staramy się wpływać na wiele tabel z instrukcję aktualizacji, która łączy na wielu stołach. Nie jest możliwe.

Jednak aktualizacja dwóch tabel w jednym wyciągu jest rzeczywiście możliwa, ale konieczne będzie utworzenie widoku przy użyciu UNION zawierającego tabele, które mają zostać zaktualizowane. Następnie można zaktualizować widok, który spowoduje aktualizację tabel podstawowych.

SQL JOINS

Ale to jest naprawdę hacky kosmetyczny trik, użyj transakcji i wiele aktualizacji, to o wiele bardziej intuicyjny.

+3

Twoje pogrubione stwierdzenie nie jest do końca prawdą. Możesz zaktualizować tabelę na podstawie sprzężenia, po prostu nie możesz mieć * wpływu * wiele tabel. Zgadzam się na hack-i-ness sugerowanego łącza (może nawet zasugeruję jego usunięcie). Czy naprawdę warto to wszystko zrobić, aby uniknąć pisania dwóch zdań? –

+0

Ten link nie opisuje, jak używać związku, może był to kolejny wpis z tego bloga? –