In SQL Server ist es möglich, INSERT
mithilfe einer SELECT
Anweisung in eine Tabelle zu gelangen :
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
Ist es auch möglich über ein Update zu aktualisierenSELECT
? Ich habe eine temporäre Tabelle mit den Werten und möchte eine andere Tabelle mit diesen Werten aktualisieren. Vielleicht so etwas:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
sql
sql-server
tsql
select
Jamesmhaley
quelle
quelle
SET Table.other_table_id = @NewValue
) dann die ON - Anweisung zu etwas ändern wieON Table.id = @IdToEdit AND other_table.id = @NewValue
Verwenden Sie in SQL Server 2008 (oder besser)
MERGE
Alternative:
quelle
MERGE
kann auch zum "Upserting" von Datensätzen verwendet werden; Das heißt,UPDATE
wenn ein übereinstimmender Datensatz vorhanden ist, einINSERT
neuer Datensatz, wenn keine Übereinstimmung gefunden wurdeUPDATE
als dieMERGE
Leute gerade gelernt haben, mit ihnen zu leben, und sie werden Teil der Landschaft ("Merkmale"). Bedenken Sie, dass Blogs nicht existierten, alsUPDATE
das neue Kind auf dem Block war.quelle
SET Table_A.col1 = SUM(Table_B.col1)
(oder eine andere Aggregatfunktion). Also besser als Robin Days Antwort für diesen Zweck.Ich würde Robins ausgezeichnete Antwort auf Folgendes ändern :
Ohne eine WHERE-Klausel wirken sich sogar Zeilen aus, die nicht betroffen sein müssen, was (möglicherweise) zu einer Neuberechnung des Index oder zu Feuerauslösern führen kann, die eigentlich nicht hätten ausgelöst werden dürfen.
quelle
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2))
ist prägnanter.Einweg
quelle
Eine andere Möglichkeit, die noch nicht erwähnt wurde, besteht darin, die
SELECT
Anweisung selbst in einen CTE zu stecken und dann den CTE zu aktualisieren.Dies hat den Vorteil, dass es einfach ist, die
SELECT
Anweisung zuerst selbst auszuführen, um die Ergebnisse zu überprüfen. Sie müssen jedoch die Spalten wie oben aliasen, wenn sie in Quell- und Zieltabellen den gleichen Namen haben.Dies hat auch die gleiche Einschränkung wie die proprietäre
UPDATE ... FROM
Syntax, die in vier der anderen Antworten gezeigt wird. Wenn sich die Quelltabelle auf der vielen Seite eines Eins-zu-Viele-Joins befindet, ist es unbestimmt, welcher der möglichen übereinstimmenden verknüpften Datensätze in der verwendet wirdUpdate
(ein Problem,MERGE
das durch Auslösen eines Fehlers vermieden wird, wenn versucht wird, den zu aktualisieren gleiche Reihe mehr als einmal).quelle
CTE
?;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
Für die Aufzeichnung (und andere, die wie ich suchen) können Sie dies in MySQL folgendermaßen tun:
quelle
Alias verwenden:
quelle
Der einfache Weg, dies zu tun, ist:
quelle
Dies kann ein Nischengrund für die Durchführung eines Updates sein (z. B. hauptsächlich in einer Prozedur verwendet) oder für andere offensichtlich sein. Es sollte jedoch auch angegeben werden, dass Sie eine Update-Select-Anweisung ausführen können, ohne join zu verwenden (falls der Tabellen, zwischen denen Sie aktualisieren, haben kein gemeinsames Feld.
quelle
Hier ist eine weitere nützliche Syntax:
Mit "WHERE EXIST" wird überprüft, ob es null ist oder nicht.
quelle
Ich füge dies nur hinzu, damit Sie einen schnellen Weg finden, es zu schreiben, damit Sie überprüfen können, was aktualisiert wird, bevor Sie das Update durchführen.
quelle
Wenn Sie MySQL anstelle von SQL Server verwenden, lautet die Syntax wie folgt:
quelle
UPDATE von SELECT mit INNER JOIN in der SQL-Datenbank
Da es zu viele Antworten auf diesen Beitrag gibt, die am stärksten positiv bewertet werden, dachte ich, ich würde auch hier meinen Vorschlag machen. Obwohl die Frage sehr interessant ist, habe ich in vielen Forenseiten eine Lösung mit INNER JOIN mit Screenshots gefunden.
Zuerst habe ich eine Tabelle mit dem Namen schoolold erstellt und einige Datensätze in Bezug auf ihre Spaltennamen eingefügt und ausgeführt.
Dann habe ich den Befehl SELECT ausgeführt, um eingefügte Datensätze anzuzeigen.
Dann habe ich eine neue Tabelle mit dem Namen schoolnew erstellt und die obigen Aktionen auf ähnliche Weise ausgeführt.
Um die darin eingefügten Datensätze anzuzeigen, führe ich den Befehl SELECT aus.
Hier möchte ich einige Änderungen in der dritten und vierten Zeile vornehmen . Um diese Aktion abzuschließen, führe ich den Befehl UPDATE mit INNER JOIN aus .
Um die Änderungen anzuzeigen, führe ich den Befehl SELECT aus .
Sie können sehen, wie der dritte und vierte Datensatz von table schoolold einfach durch table schoolnew ersetzt werden können, indem Sie INNER JOIN mit der Anweisung UPDATE verwenden.
quelle
Und wenn Sie sich mit sich selbst an den Tisch setzen möchten (was nicht allzu oft vorkommt):
quelle
targett1
undsourcet1
anstelle von (oder sowie) Kommentaren verwendet haben.Im folgenden Beispiel wird eine abgeleitete Tabelle, eine SELECT-Anweisung nach der FROM-Klausel, verwendet, um die alten und neuen Werte für weitere Aktualisierungen zurückzugeben:
quelle
Das Aktualisieren durch
CTE
ist besser lesbar als die anderen Antworten hier:quelle
Wenn Sie SQL Server verwenden, können Sie eine Tabelle von einer anderen aktualisieren, ohne einen Join anzugeben, und einfach die beiden aus der
where
Klausel verknüpfen . Dies macht eine SQL-Abfrage viel einfacher:quelle
Konsolidierung all der verschiedenen Ansätze hier.
Die Struktur der Beispieltabelle ist unten aufgeführt und wird von Product_BAK auf Product table aktualisiert.
Produkt
Product_BAK
1. Wählen Sie Update
2. Aktualisieren Sie mit einem allgemeinen Tabellenausdruck
3. Zusammenführen
In dieser Merge-Anweisung können wir Einfügungen vornehmen, wenn wir keinen passenden Datensatz im Ziel finden, aber in der Quelle vorhanden sind und die Syntax finden:
quelle
Die andere Möglichkeit besteht darin, eine abgeleitete Tabelle zu verwenden:
Beispieldaten
quelle
Um sicherzustellen, dass Sie aktualisieren, was Sie möchten, wählen Sie zuerst
quelle
Es gibt sogar eine kürzere Methode und es könnte für Sie überraschend sein:
Beispieldatensatz:
Code:
quelle
Verwenden:
ENTWEDER:
ODER:
Wenn der Name der ID-Spalte in beiden Tabellen identisch ist, setzen Sie einfach den Tabellennamen vor die zu aktualisierende Tabelle und verwenden Sie einen Alias für die ausgewählte Tabelle, dh:
quelle
In der akzeptierten Antwort nach dem:
Ich würde hinzufügen:
Normalerweise füge ich alles in eine Roll-Backed-Transaktion ein und verwende Folgendes
"OUTPUT"
: Auf diese Weise sehe ich alles, was passieren wird. Wenn ich mit dem, was ich sehe, zufrieden bin, ändere ich dasROLLBACK
inCOMMIT
.Normalerweise muss ich dokumentieren, was ich getan
"results to Text"
habe. Daher verwende ich die Option, wenn ich die Rollback-Abfrage ausführe und sowohl das Skript als auch das Ergebnis des OUTPUT speichere. (Natürlich ist das nicht praktisch, wenn ich zu viele Zeilen geändert habe)quelle
quelle
Die folgende Lösung funktioniert für eine MySQL-Datenbank:
quelle
Die andere Möglichkeit zum Aktualisieren von einer select-Anweisung:
quelle
Option 1: Verwenden von Inner Join:
Option 2: Co-bezogene Unterabfrage
quelle
Die Syntax für die UPDATE-Anweisung beim Aktualisieren einer Tabelle mit Daten aus einer anderen Tabelle in SQL Server
quelle
Sie können dies für die Aktualisierung in SQL Server verwenden
quelle