Werk een tabel bij met behulp van Join in SQL Server?

Ik wil een kolom bijwerken in een tabel die een join op een andere tabel is, b.v.:

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'

Maar het klagen:

MSG 170, Niveau 15, Staat 1, Lijn 2
Lijn 2: Onjuiste syntaxis in de buurt van ‘A’.

Wat is er hier mis?


Antwoord 1, Autoriteit 100%

U hebt niet helemaal SQL Server’s eigendom UPDATE FROMSyntaxis naar beneden. Weet je ook niet zeker waarom je je moest doen aan de CommonFielden ook daarna op het filteren. Probeer dit:

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';

Als u iets heel dwaas doet – zoals voortdurend proberen de waarde van één kolom in te stellen op het aggregaat van een andere kolom (die het principe van het vermijden van overbodige gegevens schendt), kunt u een CTE gebruiken (gemeenschappelijke tabelexpressie) – Zie hier en Hier voor meer informatie:

;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];

De reden waarom dit echt dom is, is dat u deze hele update elke keer in de rij in table2wijzigt, opnieuw wilt uitvoeren. Een SUMis iets dat u altijd kunt berekenen bij runtime en moet u hierbij nooit zorgen maken dat het resultaat oud is.


Antwoord 2, Autoriteit 3%

Probeer het als volgt:

   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'

Antwoord 3, Autoriteit 2%

Antwoord gegeven hierboven door Aaron is perfect:

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';

Wil je gewoon toevoegen waarom dit probleem optreedt in SQL Server Wanneer we alias van een tabel proberen te gebruiken tijdens het bijwerken van die tabel, zal de SYNTAX onder vermelding altijd fout geven:

update tableName t 
set t.name = 'books new' 
where t.id = 1

Case kan een willekeurig zijn als u een enkele tabel bijwerkt of bij het bijwerken tijdens het gebruik van join.

Hoewel bovenstaande query prima werkt in PL / SQL, maar niet in SQL Server.

Correcte manier om een ​​tabel bij te werken tijdens het gebruik van de tabel Alias ​​in SQL Server is:

update t 
set t.name = 'books new' 
from tableName t 
where t.id = 1

Ik hoop dat het iedereen zal helpen waarom er geen fout kwam.


Antwoord 4

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";

Antwoord 5

Het lijkt erop dat SQL Server 2012 de oude updatesyntaxis van Teradata kan verwerken:

UPDATE a
SET a.CalculatedColumn= b.[Calculated Column]
FROM table1 a, table2 b 
WHERE 
    b.[common field]= a.commonfield
AND a.BatchNO = '110'

Als ik me goed herinner, was 2008R2 een fout opgetreden toen ik vergelijkbare query probeerde.


Antwoord 6

Ik vind het handig om een ​​update in een Select in te schakelen om de rijen te krijgen die ik wil bijwerken als een test voordat u bijwerkt. Als ik de exacte rijen kan selecteren die ik wil, kan ik alleen die rijen bijwerken die ik wil bijwerken.

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

Antwoord 7

   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'

Meer alternatieven hier .


Antwoord 8

Een andere benadering zou zijn om MERGE te gebruiken

 ;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 maakt deel uit van de SQL-standaard

-Ik ben er ook vrij zeker van dat updates van innerlijke joins niet deterministisch zijn..
Soortgelijke vraag hier waar het antwoord daarover gaat
http://ask.sqlservercentral.com/questions /19089/update-twee-tabellen-met-single-query.html


Antwoord 9

Ik had hetzelfde probleem.. en je hoeft geen fysieke kolom toe te voegen.. want nu moet je het onderhouden..
wat u kunt doen is een generieke kolom toevoegen aan de selectiequery:

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

Antwoord 10

Aarons aanpak hierboven werkte perfect voor mij. Mijn update-instructie was iets anders omdat ik moest deelnemen op basis van twee velden die in één tabel aaneengeschakeld waren om overeen te komen met een veld in een andere tabel.

--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

Antwoord 11

Volgens mij is dit wat u zoekt.

UPDATE
    Table1
SET
    Table1.columeName =T1.columeName * T2.columeName
FROM 
    Table1 T1
    INNER JOIN Table2 T2
        ON T1.columeName = T2.columeName;

Antwoord 12

Probeer:

UPDATE table1
SET CalculatedColumn = ( SELECT [Calculated Column] 
                         FROM table2 
                         WHERE table1.commonfield = [common field])
WHERE  BatchNO = '110'

Other episodes