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?

1819voto

Aaron Bertrand Punkte 259330

Sie haben nicht ganz das proprietäre SQL Server UPDATE FROM Syntax nach unten. Ich bin mir auch nicht sicher, warum Sie die Verbindung mit dem CommonField und danach auch filtern. Versuchen Sie dies:

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

Wenn Sie etwas Dummes tun - wie z.B. ständig versuchen, den Wert einer Spalte auf das Aggregat einer anderen Spalte zu setzen (was gegen den Grundsatz verstößt, redundante Daten zu vermeiden), können Sie einen CTE (common table expression) verwenden - siehe aquí y aquí für weitere Einzelheiten:

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

Der Grund dafür ist, dass Sie die gesamte Aktualisierung jedes Mal neu durchführen müssen, wenn eine Zeile in table2 Änderungen. A SUM ist etwas, das Sie immer zur Laufzeit berechnen können und dabei nie befürchten müssen, dass das Ergebnis veraltet ist.

6 Stimmen

Wenn ich dies versuche, mag es nicht UPDATE table1 a SET a.[field] = b.[field] -- das Entfernen des a-Alias funktioniert, also UPDATE table1 a SET [field] = b.[field]

1 Stimmen

@baldmosher Ich wette, es gibt noch ein anderes Problem, könnten Sie ein Repro auf SQL fiddle posten?

4 Stimmen

Bei mir hat es mit MySQL nicht funktioniert. Ich musste das Folgende verwenden (was mehr Sinn macht): UPDATE t1 INNER JOIN t2 on t2.col = t1.col SET t1.field=value WHERE t2.col=something .

65voto

RBarryYoung Punkte 53364

Versuchen Sie es so:

    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'

1 Stimmen

Warum eine Transaktion verwenden?

15 Stimmen

@CervEd Da die ursprüngliche Frage die Transaktion enthielt, habe ich einfach den Code des Auftraggebers korrigiert, und Jahre später hat ihn jemand ohne triftigen Grund entfernt. Eine schlimme Sache bei StackOverflow ist, dass Leute unnötige Änderungen an Originalfragen vornehmen, nur damit sie die Redakteursabzeichen bekommen können, aber diese unbedachten Änderungen können die bereits geposteten Antworten seltsam oder sogar unsinnig aussehen lassen.

3 Stimmen

Danke, ich war mir nicht bewusst, dass die Frage des Auftraggebers bearbeitet wurde, so dass ich mich fragte, ob es einen bestimmten Grund für die Verwendung einer Transaktion gab, der für mich nicht offensichtlich war

41voto

Ankur Bhutani Punkte 2857

Die oben von Aaron gegebene Antwort ist perfekt:

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

Ich möchte nur hinzufügen, warum dieses Problem in SQL Server auftritt, wenn wir versuchen, Alias einer Tabelle zu verwenden, während die Aktualisierung dieser Tabelle, unten erwähnen Syntax wird immer Fehler geben:

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

Fall kann jeder sein, wenn Sie eine einzelne Tabelle aktualisieren oder eine Aktualisierung unter Verwendung einer Verknüpfung vornehmen.

Obwohl obige Abfrage funktioniert gut in PL/SQL, aber nicht in SQL Server.

Der korrekte Weg, eine Tabelle zu aktualisieren, während Sie einen Tabellenalias in SQL Server verwenden, ist:

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

Ich hoffe, dass es allen hilft, warum der Fehler hierher kam.

2 Stimmen

Schön, danke. Ihre Antwort ist die richtige für diese Frage.

5voto

wut Punkte 309
    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'

Mehr Alternativen aquí .

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

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