Nie do końca masz zastrzeżoną UPDATE FROM
składnię SQL Server . Nie jestem również pewien, dlaczego musiałeś dołączyć do, CommonField
a także filtrować go później. Spróbuj tego:
UPDATE t1
SET t1.CalculatedColumn = t2.[Calculated Column]
FROM dbo.Table1 AS t1
INNER JOIN dbo.Table2 AS t2
ON t1.CommonField = t2.[Common Field]
WHERE t1.BatchNo = '110';
Jeśli robisz coś naprawdę głupiego - na przykład ciągłą próbę ustawienia wartości jednej kolumny na agregację drugiej kolumny (co narusza zasadę unikania przechowywania zbędnych danych), możesz użyć CTE (wspólne wyrażenie tabeli) - patrz tutaj i tutaj po więcej szczegółów:
;WITH t2 AS
(
SELECT [key], CalculatedColumn = SUM(some_column)
FROM dbo.table2
GROUP BY [key]
)
UPDATE t1
SET t1.CalculatedColumn = t2.CalculatedColumn
FROM dbo.table1 AS t1
INNER JOIN t2
ON t1.[key] = t2.[key];
Powodem, dla którego jest to naprawdę głupie, jest to, że będziesz musiał ponownie uruchomić całą aktualizację za każdym razem, gdy jakikolwiek wiersz table2
zmian. Jest SUM
to coś, co zawsze można obliczyć w czasie wykonywania, a dzięki temu nigdy nie musisz się martwić, że wynik jest nieaktualny.
UPDATE table1 a SET a.[field] = b.[field]
- usunięcie aliasu działa, więcUPDATE table1 a SET [field] = b.[field]
UPDATE t1 INNER JOIN t2 on t2.col = t1.col SET t1.field=value WHERE t2.col=something
.Spróbuj tak:
źródło
Odpowiedź udzielona powyżej przez Aarona jest idealna:
Chcę tylko dodać, dlaczego ten problem występuje w SQL Server, gdy próbujemy użyć aliasu tabeli podczas aktualizacji tej tabeli, poniżej wzmianka o składni zawsze da błąd:
case może być dowolny, jeśli aktualizujesz pojedynczą tabelę lub aktualizujesz podczas korzystania z funkcji join.
Chociaż powyższe zapytanie działa poprawnie w PL / SQL, ale nie w SQL Server.
Prawidłowy sposób aktualizacji tabeli przy użyciu aliasu tabeli w programie SQL Server to:
Mam nadzieję, że to pomoże wszystkim, dlaczego pojawił się błąd.
źródło
źródło
Wygląda na to, że SQL Server 2012 może również obsługiwać starą składnię aktualizacji Teradata:
Jeśli dobrze pamiętam, 2008R2 dawał błąd, gdy próbowałem podobnego zapytania.
źródło
Uważam, że warto zamienić UPDATE w SELECT, aby uzyskać wiersze, które chcę zaktualizować jako test przed aktualizacją. Jeśli mogę wybrać dokładnie wiersze, które chcę, mogę zaktualizować tylko te wiersze, które chcę zaktualizować.
źródło
Więcej alternatyw tutaj .
źródło
Innym podejściem byłoby użycie MERGE
-Gerencja jest częścią standardu SQL
-Jestem również pewien, że aktualizacje połączeń wewnętrznych nie są deterministyczne. Podobne pytanie tutaj, gdzie odpowiedź mówi o tym http://ask.sqlservercentral.com/questions/19089/updating-two-tablice-use-single-query. HTML
źródło
MERGE
.Miałem ten sam problem .. i nie musisz dodawać fizycznej kolumny .. ponieważ teraz będziesz musiał ją utrzymać .. co możesz zrobić, to dodać kolumnę ogólną w wybranym zapytaniu:
DAWNY:
źródło
Powyższe podejście Aarona działało dla mnie idealnie. Moja instrukcja aktualizacji była nieco inna, ponieważ musiałem połączyć się w oparciu o dwa pola połączone w jednej tabeli, aby dopasować pole w innej tabeli.
źródło
Próbować:
źródło
table1
, a nie tylko wierszy, w których występuje zgodność na wspólnym polu między dwiema tabelami (w rzeczywistości złączenie lewe, a nie łączenie wewnętrzne).BatchNo = '110'
, prawda? Czy wszystkie głosy negatywne wynikły z tego efektu, czy też inni mieli inne powody, by głosować negatywnie?NULL
, a ta forma może być rozwiązaniem mniej specyficznym dla T-SQL.