Ich habe mich gefragt, ob es möglich ist, alle Datenzeilen von einer Tabelle in eine andere zu verschieben, die einer bestimmten Abfrage entsprechen.
Zum Beispiel muss ich alle Tabellenzeilen von Tabelle1 nach Tabelle2 verschieben, wobei ihr Benutzername = 'X' und ihr Passwort = 'X' sind, damit sie nicht mehr in Tabelle1 angezeigt werden.
Ich verwende SQL Server 2008 Management Studio.
sql
sql-server
doubleplusgood
quelle
quelle
BEGIN TRANSACTION;
Beginn dieses Beispiels keine vorhanden waren . Wäre es nicht eine gute Idee, dies dem Beispiel der Antwort hinzuzufügen?Dies ist ein alter Beitrag, sorry, aber ich bin erst jetzt darauf gestoßen und wollte meine Lösung jedem geben, der eines Tages darüber stolpern könnte.
Wie einige erwähnt haben, kann das Ausführen eines
INSERT
und dann einesDELETE
zu Integritätsproblemen führen. Eine Möglichkeit, dies zu umgehen und alles in einer einzigen Anweisung sauber auszuführen, besteht darin, die[deleted]
temporäre Tabelle zu nutzen.DELETE FROM [source] OUTPUT [deleted].<column_list> INTO [destination] (<column_list>)
quelle
DELETE
Anweisung werden alle Datensätze zuerst in die[deleted]
temporäre Tabelle geschrieben, bevor dieDELETE
Klausel aufgelöst wird. Von dort aus können sie verarbeitet - in diesem Fall in eine andere Tabelle eingefügt - und anschließend die Anweisung aufgelöst werden. Wenn der Verarbeitungsabschnitt der Anweisung fehlschlägt, wird die gesamte Anweisung beendet. nicht nur dieINTO
Klausel. AußerdemBEGIN TRY...BEGIN CATCH
undROLLBACK TRANSACTION
sind große vorbeugende Aussagen.OUTPUT
Schlüsselwort wird einfach verwendet, um ein eingereichtes Dataset an die nachfolgende Anweisung zurückzugeben, ist jedoch nur in einigen Fällen gültig, z. B.UPDATE
([inserted]
) undDELETE
wenn ich mich richtig erinnere. Die[deleted]
Tabelle ist eine implizite, temporäre Tabelle - nicht genau sicher, wo sie sich befindet oder welcher Prozess sie verwaltet -, die auf die aktuelle Anweisungsausführung ausgerichtet ist. So wie Sie etwas tun können,SELECT [source].[column] INTO [destination]
bei demSELECT
ein Datensatz zurückgegeben undINTO
empfangen wird, können SieOUTPUT
den gelöschten Datensatz an denINTO
Empfänger zurückgeben.OUTPUT
Anweisung ist nicht standardmäßiges SQL, FWIW (z. B. funktioniert nicht insqlite3
).Alle diese Antworten führen dieselbe Abfrage für INSERT und DELETE aus. Wie bereits erwähnt, besteht die Gefahr, dass DELETE zwischen Anweisungen eingefügte Datensätze aufnimmt und bei komplexer Abfrage langsam sein kann (obwohl clevere Engines den zweiten Aufruf schnell ausführen sollten).
Der richtige Weg (vorausgesetzt, INSERT befindet sich in einer neuen Tabelle) besteht darin, DELETE für Tabelle1 mithilfe des Schlüsselfelds von Tabelle2 auszuführen.
Das Löschen sollte sein:
DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName)
Entschuldigen Sie meine Syntax, ich springe zwischen den Motoren, aber Sie haben die Idee.
quelle
Ja ist es. Zuerst INSERT + SELECT und dann DELETE Orginals.
INSERT INTO Table2 (UserName,Password) SELECT UserName,Password FROM Table1 WHERE UserName='X' AND Password='X'
dann löschen Sie die Ursprünge
DELETE FROM Table1 WHERE UserName='X' AND Password='X'
Möglicherweise möchten Sie
UserID
oder einen anderen Primärschlüssel beibehalten, dann können SieIDENTITY INSERT
den Schlüssel beibehalten.Weitere Informationen finden Sie unter SET IDENTITY_INSERT in MSDN
quelle
Eine sauberere Darstellung dessen, was einige andere Antworten angedeutet haben:
DELETE sourceTable OUTPUT DELETED.* INTO destTable (Comma, separated, list, of, columns) WHERE <conditions (if any)>
quelle
Verwenden Sie diese einzelne SQL-Anweisung, für die kein Commit / Rollback mit mehreren Anweisungen erforderlich ist.
INSERT Table2 ( username,password ) SELECT username,password FROM ( DELETE Table1 OUTPUT DELETED.username, DELETED.password WHERE username = 'X' and password = 'X' ) AS RowsToMove ;
Funktioniert auf SQL Server und nimmt entsprechende Änderungen für MySQL vor
quelle
Versuche dies
INSERT INTO TABLE2 (Cols...) SELECT Cols... FROM TABLE1 WHERE Criteria
Dann
DELETE FROM TABLE1 WHERE Criteria
quelle
Sie sollten in der Lage sein, mit einer Unterabfrage in der INSERT-Anweisung.
INSERT INTO table1(column1, column2) SELECT column1, column2 FROM table2 WHERE ...;
gefolgt vom Löschen aus Tabelle1.
Denken Sie daran, es als einzelne Transaktion auszuführen, damit Sie den gesamten Vorgang zurücksetzen können, wenn etwas schief geht.
quelle
Sie könnten dies versuchen:
SELECT * INTO tbl_NewTableName FROM tbl_OldTableName WHERE Condition1=@Condition1Value
Führen Sie dann einen einfachen Löschvorgang aus:
DELETE FROM tbl_OldTableName WHERE Condition1=@Condition1Value
quelle
Sie können "Logical Partitioning" verwenden , um Daten zwischen Tabellen zu wechseln:
Durch Aktualisieren der Partitionsspalte werden Daten automatisch in die andere Tabelle verschoben:
Hier ist das Beispiel:
CREATE TABLE TBL_Part1 (id INT NOT NULL, val VARCHAR(10) NULL, PartitionColumn VARCHAR(10) CONSTRAINT CK_Part1 CHECK(PartitionColumn = 'TBL_Part1'), CONSTRAINT TBL_Part1_PK PRIMARY KEY(PartitionColumn, id) ); CREATE TABLE TBL_Part2 (id INT NOT NULL, val VARCHAR(10) NULL, PartitionColumn VARCHAR(10) CONSTRAINT CK_Part2 CHECK(PartitionColumn = 'TBL_Part2'), CONSTRAINT TBL_Part2_PK PRIMARY KEY(PartitionColumn, id) ); GO CREATE VIEW TBL(id, val, PartitionColumn) WITH SCHEMABINDING AS SELECT id, val, PartitionColumn FROM dbo.TBL_Part1 UNION ALL SELECT id, val, PartitionColumn FROM dbo.TBL_Part2; GO --Insert sample to TBL ( will be inserted to Part1 ) INSERT INTO TBL VALUES(1, 'rec1', 'TBL_Part1'); INSERT INTO TBL VALUES(2, 'rec2', 'TBL_Part1'); GO --Query sub table to verify SELECT * FROM TBL_Part1 GO --move the data to table TBL_Part2 by Logical Partition switching technique UPDATE TBL SET PartitionColumn = 'TBL_Part2'; GO --Query sub table to verify SELECT * FROM TBL_Part2
quelle
So geht's mit einer einzelnen Anweisung
WITH deleted_rows AS ( DELETE FROM source_table WHERE id = 1 RETURNING * ) INSERT INTO destination_table SELECT * FROM deleted_rows;
BEISPIEL:
postgres=# select * from test1 ; id | name ----+-------- 1 | yogesh 2 | Raunak 3 | Varun (3 rows) postgres=# select * from test2; id | name ----+------ (0 rows) postgres=# WITH deleted_rows AS ( postgres(# DELETE FROM test1 WHERE id = 1 postgres(# RETURNING * postgres(# ) postgres-# INSERT INTO test2 postgres-# SELECT * FROM deleted_rows; INSERT 0 1 postgres=# select * from test2; id | name ----+-------- 1 | yogesh (1 row) postgres=# select * from test1; id | name ----+-------- 2 | Raunak 3 | Varun
quelle
Wenn die beiden Tabellen dieselbe ID verwenden oder einen gemeinsamen EINZIGARTIGEN Schlüssel haben:
1) Fügen Sie den ausgewählten Datensatz in Tabelle 2 ein
INSERT INTO table2 SELECT * FROM table1 WHERE (conditions)
2) Löschen Sie den ausgewählten Datensatz aus Tabelle1, falls in Tabelle2 vorhanden
DELETE FROM table1 as A, table2 as B WHERE (A.conditions) AND (A.ID = B.ID)
quelle
Es wird eine Tabelle erstellt und alle Daten von der alten Tabelle in die neue Tabelle kopiert
SELECT * INTO event_log_temp FROM event_log
Und Sie können die alten Tabellendaten löschen.
DELETE FROM event_log
quelle