Spostare i dati SQL da una tabella a un’altra

Mi stavo chiedendo se è ansible spostare tutte le righe di dati da una tabella a un’altra, che corrispondono a una determinata query?

Ad esempio, ho bisogno di spostare tutte le righe della tabella da Table1 a Table2 dove il loro username = ‘X’ e password = ‘X’, in modo che non vengano più visualizzati in Table1.

Sto usando SQL Server 2008 Management Studio.

Dovrebbe essere ansible utilizzare due dichiarazioni all’interno di una transazione, un inserimento e una cancellazione:

INSERT INTO Table2 () SELECT  FROM Table1 WHERE ; DELETE FROM Table1 WHERE ; COMMIT; 

Questa è la forma più semplice. Se devi preoccuparti di inserire nuovi record corrispondenti in table1 tra le due istruzioni, puoi aggiungere un and exists .

Questo è un post antico, mi dispiace, ma l’ho incontrato solo ora e volevo dare la mia soluzione a chiunque potesse imbattersi in questo un giorno.

Come alcuni hanno già detto, l’esecuzione di un INSERT e di un DELETE potrebbe portare a problemi di integrità, quindi forse un modo per aggirarlo, e per eseguire tutto in una singola istruzione, è sfruttare la tabella temporanea [deleted] .

 DELETE FROM [source] OUTPUT [deleted]. INTO [destination] () 

Tutte queste risposte eseguono la stessa query per INSERT e DELETE. Come accennato in precedenza, ciò comporta il DELETE che raccoglie i record inseriti tra le istruzioni e potrebbe essere lento se la query è complessa (anche se i motori intelligenti “dovrebbero” eseguire rapidamente la seconda chiamata).

Il modo corretto (supponendo che INSERT si trovi in ​​una nuova tabella) consiste nel fare DELETE contro table1 usando il campo chiave di table2.

L’eliminazione dovrebbe essere:

 DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName) 

Scusa la mia syntax, sto saltando tra i motori ma tu hai l’idea.

Sì. Prima INSERIRE SELEZIONA e poi ELIMINA gli originali.

 INSERT INTO Table2 (UserName,Password) SELECT UserName,Password FROM Table1 WHERE UserName='X' AND Password='X' 

quindi eliminare gli originali

 DELETE FROM Table1 WHERE UserName='X' AND Password='X' 

potresti voler conservare UserID o qualche altra chiave primaria, quindi puoi usare IDENTITY INSERT per conservare la chiave.

vedere di più su SET IDENTITY_INSERT su MSDN

Prova questo

 INSERT INTO TABLE2 (Cols...) SELECT Cols... FROM TABLE1 WHERE Criteria 

Poi

 DELETE FROM TABLE1 WHERE Criteria 

Dovresti essere in grado di eseguire una sottoquery nell’istruzione INSERT.

 INSERT INTO table1(column1, column2) SELECT column1, column2 FROM table2 WHERE ...; 

seguito dalla cancellazione da table1.

Ricordati di eseguirlo come una singola transazione in modo che se qualcosa va storto puoi ripristinare l’intera operazione.

Potresti provare questo:

 SELECT * INTO tbl_NewTableName FROM tbl_OldTableName WHERE [email protected] 

Quindi esegui una semplice eliminazione:

 DELETE FROM tbl_OldTableName WHERE [email protected] 

Utilizzare questa singola istruzione sql che è sicura senza bisogno di commit / rollback con più istruzioni.

 INSERT Table2 ( username,password ) SELECT username,password FROM ( DELETE Table1 OUTPUT DELETED.username, DELETED.password WHERE username = 'X' and password = 'X' ) AS RowsToMove ; 

Funziona sul server SQL apporta le modifiche appropriate per MySql

Una rappresentazione più chiara di ciò che altre risposte hanno suggerito:

 DELETE sourceTable OUTPUT DELETED.* INTO destTable (Comma, separated, list, of, columns) WHERE  

Se le due tabelle usano lo stesso ID o hanno una chiave UNIQUE comune:

1) Inserisci il record selezionato nella tabella 2

 INSERT INTO table2 SELECT * FROM table1 WHERE (conditions) 

2) cancella il record selezionato da table1 se presente in table2

 DELETE FROM table1 as A, table2 as B WHERE (A.conditions) AND (A.ID = B.ID) 

Ecco come farlo con una singola affermazione

 WITH deleted_rows AS ( DELETE FROM source_table WHERE id = 1 RETURNING * ) INSERT INTO destination_table SELECT * FROM deleted_rows; 

ESEMPIO:

  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 

Puoi usare “Logical Partitioning” per cambiare i dati tra le tabelle:

Aggiornando la colonna della partizione, i dati verranno automaticamente spostati nell’altra tabella:

ecco il campione:

 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