Aktualizować tabelę za pomocą JOIN w SQL Server?
Chcę zaktualizować kolumnę w tabeli tworząc join na innej tabeli np.:
UPDATE table1 a
INNER JOIN table2 b ON a.commonfield = b.[common field]
SET a.CalculatedColumn= b.[Calculated Column]
WHERE
b.[common field]= a.commonfield
AND a.BatchNO = '110'
Ale się skarży :
Co tu się dzieje?Msg 170, Poziom 15, Stan 1, Linia 2
Linia 2: Nieprawidłowa składnia w pobliżu 'a'.
11 answers
Nie masz do końca własnej składni SQL Server UPDATE FROM
. Również nie wiem, dlaczego trzeba dołączyć do CommonField
, a także filtrować na nim 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ągle próbujesz ustawić wartość jednej kolumny na agregat innej kolumny( co narusza zasadę unikania przechowywania zbędnych danych), możesz użyć CTE (common table expression) - zobacz tutaj i tutaj aby uzyskać więcej informacji szczegóły:
;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ć tę aktualizację za każdym razem, gdy zmieni się jakikolwiek wiersz table2
. A SUM
jest czymś, co zawsze można obliczyć w czasie wykonywania i w ten sposób nie trzeba się martwić, że wynik jest nieświeży.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-26 17:54:53
Spróbuj tak:
UPDATE a
SET a.CalculatedColumn= b.[Calculated Column]
FROM table1 a INNER JOIN table2 b ON a.commonfield = b.[common field]
WHERE a.BatchNO = '110'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-23 14:50:46
Odpowiedź udzielona powyżej przez Aarona jest doskonała:
UPDATE a
SET a.CalculatedColumn = b.[Calculated Column]
FROM Table1 AS a
INNER JOIN Table2 AS b
ON a.CommonField = b.[Common Field]
WHERE a.BatchNo = '110';
Chcę tylko dodać, dlaczego ten problem występuje w SQL Server, gdy próbujemy użyć aliasu tabeli podczas aktualizacji tej tabeli, poniżej składnia wzmianki zawsze będzie dawać błąd:
update tableName t
set t.name = 'books new'
where t.id = 1
Przypadek może być dowolny, Jeśli aktualizujesz pojedynczą tabelę lub aktualizujesz podczas korzystania z funkcji join.
Chociaż powyższe zapytanie będzie działać dobrze w PL / SQL, ale nie w SQL Server.
Poprawny sposób aktualizacji tabeli przy użyciu aliasu tabeli w SQL Server jest:
update t
set t.name = 'books new'
from tableName t
where t.id = 1
Mam nadzieję, że to pomoże wszystkim, dlaczego błąd przyszedł tutaj.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 06:41:02
MERGE table1 T
USING table2 S
ON T.CommonField = S."Common Field"
AND T.BatchNo = '110'
WHEN MATCHED THEN
UPDATE
SET CalculatedColumn = S."Calculated Column";
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-13 07:30:49
Wygląda na to, że SQL Server 2012 może również obsługiwać starą składnię aktualizacji Teradata:
UPDATE a
SET a.CalculatedColumn= b.[Calculated Column]
FROM table1 a, table2 b
WHERE
b.[common field]= a.commonfield
AND a.BatchNO = '110'
Jeśli dobrze pamiętam, 2008R2 dawał błąd, gdy próbowałem podobnego zapytania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 15:03:12
Uważam, że przydatne jest przekształcenie aktualizacji w SELECT, aby uzyskać wiersze, które chcę zaktualizować jako test przed aktualizacją. Jeśli Mogę wybrać dokładne wiersze, które chcę, mogę zaktualizować tylko te wiersze, które chcę zaktualizować.
DECLARE @expense_report_id AS INT
SET @expense_report_id = 1027
--UPDATE expense_report_detail_distribution
--SET service_bill_id = 9
SELECT *
FROM expense_report_detail_distribution erdd
INNER JOIN expense_report_detail erd
INNER JOIN expense_report er
ON er.expense_report_id = erd.expense_report_id
ON erdd.expense_report_detail_id = erd.expense_report_detail_id
WHERE er.expense_report_id = @expense_report_id
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 06:01:21
UPDATE mytable
SET myfield = CASE other_field
WHEN 1 THEN 'value'
WHEN 2 THEN 'value'
WHEN 3 THEN 'value'
END
From mytable
Join otherTable on otherTable.id = mytable.id
Where othertable.somecolumn = '1234'
Więcej alternatyw Tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-17 18:25:32
Innym podejściem byłoby użycie MERGE
;WITH cteTable1(CalculatedColumn, CommonField)
AS
(
select CalculatedColumn, CommonField from Table1 Where BatchNo = '110'
)
MERGE cteTable1 AS target
USING (select "Calculated Column", "Common Field" FROM dbo.Table2) AS source ("Calculated Column", "Common Field")
ON (target.CommonField = source."Common Field")
WHEN MATCHED THEN
UPDATE SET target.CalculatedColumn = source."Calculated Column";
- Merge jest częścią standardu SQL
- również jestem pewien, że wewnętrzne aktualizacje join nie są deterministyczne.. Podobne pytanie tutaj, gdzie odpowiedź mówi o tym http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-13 19:13:23
Miałem ten sam problem.. i nie musisz dodawać fizycznej kolumny.. bo teraz będziesz musiał go utrzymać.. możesz dodać ogólną kolumnę w zapytaniu Wybierz:
EX:
select tb1.col1, tb1.col2, tb1.col3 ,
(
select 'Match' from table2 as tbl2
where tbl1.col1 = tbl2.col1 and tab1.col2 = tbl2.col2
)
from myTable as tbl1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 23:14:09
Podejście Aarona zadziałało dla mnie idealnie. Moja Instrukcja aktualizacji była nieco inna, ponieważ musiałem połączyć się na podstawie dwóch pól połączonych w jednej tabeli, aby dopasować pole w innej tabeli.
--update clients table cell field from custom table containing mobile numbers
update clients
set cell = m.Phone
from clients as c
inner join [dbo].[COSStaffMobileNumbers] as m
on c.Last_Name + c.First_Name = m.Name
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-09 13:14:51
Try:
UPDATE table1
SET CalculatedColumn = ( SELECT [Calculated Column]
FROM table2
WHERE table1.commonfield = [common field])
WHERE BatchNO = '110'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 07:53:48