982 Stimmen

Aktualisieren einer Tabelle mit JOIN in SQL Server?

Ich möchte eine Spalte in einer Tabelle aktualisieren, die eine Verknüpfung mit einer anderen Tabelle herstellt, z. B.:

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'

Aber es wird geklagt:

Msg 170, Ebene 15, Zustand 1, Zeile 2
Zeile 2: Falsche Syntax bei 'a'.

Was ist hier falsch?

4voto

onedaywhen Punkte 52850
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";

3voto

CW1255 Punkte 105

Ich finde es nützlich, ein UPDATE in ein SELECT zu verwandeln, um die Zeilen zu erhalten, die ich vor der Aktualisierung testweise aktualisieren möchte. Wenn ich genau die gewünschten Zeilen auswählen kann, kann ich nur die Zeilen aktualisieren, die ich aktualisieren möchte.

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

2voto

Shane Neuville Punkte 2087

Ein anderer Ansatz wäre die Verwendung von 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 ist Teil des SQL-Standards

-Außerdem bin ich mir ziemlich sicher, dass die Aktualisierungen der inneren Verbindungen nicht deterministisch sind. Ähnliche Frage hier, wo die Antwort spricht über das http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query.html

4 Stimmen

Sie mögen zwar Standard sein, Ich würde sehr vorsichtig sein mit MERGE .

1 Stimmen

Was alles irgendwie lustig ist, weil ich buchstäblich 5 Minuten, nachdem ich dies gepostet habe, auf einige problematische nicht-deterministische Updates in den Sprocs gestoßen bin, die ich geerbt habe :-) lustiges Zeug

0 Stimmen

Das macht die Verschmelzung nicht besser, es bedeutet nur, dass Sie schlechte Updates haben.

2voto

Null Punkte 21

Ich glaube, das ist es, wonach Sie suchen.

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

1voto

Mahmoud Sayed Punkte 131

Ich hatte das gleiche Problem und Sie müssen keine physische Spalte hinzufügen denn jetzt müssen Sie sie pflegen Was Sie tun können, ist eine generische Spalte in der Select-Abfrage hinzufügen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X