Die proprietäre UPDATE FROM
Syntax von SQL Server ist nicht ganz ausgefallen . Auch nicht sicher, warum Sie sich dem anschließen CommonField
und danach auch filtern mussten. Versuche 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 wirklich Dummes tun - beispielsweise ständig versuchen, den Wert einer Spalte auf das Aggregat einer anderen Spalte zu setzen (was gegen das Prinzip verstößt, das Speichern redundanter Daten zu vermeiden), können Sie einen CTE (Common Table Expression) verwenden - siehe hier und hier für weitere Details:
;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, warum dies wirklich albern ist, ist, dass Sie das gesamte Update jedes Mal neu ausführen müssen, wenn table2
Änderungen vorgenommen werden. A SUM
können Sie immer zur Laufzeit berechnen und müssen sich dabei keine Sorgen machen, dass das Ergebnis veraltet ist.
UPDATE table1 a SET a.[field] = b.[field]
- das Entfernen des Alias funktioniert, alsoUPDATE table1 a SET [field] = b.[field]
UPDATE t1 INNER JOIN t2 on t2.col = t1.col SET t1.field=value WHERE t2.col=something
.Versuchen Sie es so:
quelle
Die oben von Aaron gegebene Antwort ist perfekt:
Ich möchte nur hinzufügen, warum dieses Problem in SQL Server auftritt, wenn wir versuchen, beim Aktualisieren dieser Tabelle den Alias einer Tabelle zu verwenden. Die unten erwähnte Syntax führt immer zu Fehlern:
Dies kann der Fall sein, wenn Sie eine einzelne Tabelle aktualisieren oder während der Verwendung von join aktualisieren.
Die obige Abfrage funktioniert zwar einwandfrei in PL / SQL, jedoch nicht in SQL Server.
Die richtige Methode zum Aktualisieren einer Tabelle unter Verwendung des Tabellenalias in SQL Server ist:
Hoffe, es wird allen helfen, warum hier Fehler aufgetreten sind.
quelle
quelle
Anscheinend kann SQL Server 2012 auch die alte Update-Syntax von Teradata verarbeiten:
Wenn ich mich richtig erinnere, gab 2008R2 einen Fehler aus, als ich eine ähnliche Abfrage versuchte.
quelle
Ich finde es nützlich, ein UPDATE in ein SELECT umzuwandeln, um die Zeilen, die ich aktualisieren möchte, vor dem Aktualisieren als Test abzurufen. Wenn ich genau die gewünschten Zeilen auswählen kann, kann ich nur die Zeilen aktualisieren, die ich aktualisieren möchte.
quelle
Weitere Alternativen hier .
quelle
Ein anderer Ansatz wäre die Verwendung von MERGE
-Merge ist Teil des SQL-Standards
-Auch ich bin mir ziemlich sicher, dass innere Join-Updates nicht deterministisch sind. Ähnliche Frage hier, wo die Antwort darüber spricht http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query. html
quelle
MERGE
.Ich hatte das gleiche Problem. Und Sie müssen keine physische Spalte hinzufügen. Denn jetzt müssen Sie sie pflegen. Sie können lediglich eine generische Spalte in die Auswahlabfrage einfügen:
EX:
quelle
Aarons Ansatz oben hat perfekt für mich funktioniert. Meine Update-Anweisung war etwas anders, da ich basierend auf zwei in einer Tabelle verketteten Feldern beitreten musste, um mit einem Feld in einer anderen Tabelle übereinzustimmen.
quelle
Versuchen:
quelle
table1
, nicht nur die Zeilen, in denen das gemeinsame Feld zwischen beiden Tabellen übereinstimmt (effektiv ein linker Join und kein innerer Join).BatchNo = '110'
, oder? Sind alle Abstimmungen auf diesen Effekt zurückzuführen, oder hatten andere andere Gründe für eine Abwertung?NULL
, und dieses Formular möglicherweise eine weniger T-SQL-spezifische Lösung ist.