Mover os dados SQL de uma tabela para outra

estava a pensar se é possível mover todas as linhas de dados de uma tabela para outra, que correspondem a uma determinada consulta?

por exemplo, eu preciso mover todas as linhas da tabela de Table1 para Table2 onde seu nome de usuário = 'X' e senha = 'X', para que eles não mais apareçam no Table1.

Estou a usar o SQL Server 2008 Management Studio.

Author: Vadim Kotov, 2009-10-23

12 answers

Deve ser possível utilizar duas declarações numa transacção, uma inserção e uma supressão:

INSERT INTO Table2 (<columns>)
SELECT <columns>
FROM Table1
WHERE <condition>;

DELETE FROM Table1
WHERE <condition>;

COMMIT;
Esta é a forma mais simples. Se tiver de se preocupar com a inserção de novos registos correspondentes no quadro 1 entre as duas declarações, poderá adicionar um and exists <in table2>.
 82
Author: Thorsten, 2009-10-23 17:36:35
Este é um post antigo, desculpa, mas só o encontrei agora e queria dar a minha solução a quem pudesse tropeçar neste dia.

Como alguns mencionaram, realizar um INSERT e depois um DELETE pode levar a problemas de integridade, então talvez uma maneira de contorná-lo, e para executar tudo de forma limpa em uma única declaração, é tirar vantagem da tabela temporária [deleted].

DELETE FROM [source]
OUTPUT [deleted].<column_list>
INTO [destination] (<column_list>)
 34
Author: that0th3rGuy, 2014-02-27 07:19:42

Todas estas respostas executam a mesma consulta para inserir e apagar. Como mencionado anteriormente, isso corre o risco de a remoção pegar registros inseridos entre declarações e poderia ser lento se a consulta é complexa (embora motores inteligentes "deve" fazer a segunda chamada rápida).

A forma correcta (assumindo que a inserção está numa tabela nova) é apagar com o quadro 1 usando o campo de chaves do quadro 2.

A supressão deve ser:

DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName)
Desculpa a sintaxe, estou a saltar. entre motores, mas já percebeste a ideia.
 15
Author: Ken Sands, 2012-01-09 19:01:00
Sim, é. Primeiro inserir + seleccionar e depois apagar os originais.
INSERT INTO Table2 (UserName,Password)
SELECT UserName,Password FROM Table1 WHERE UserName='X' AND Password='X'

Depois apaga os orginals

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

Pode querer preservar UserID ou qualquer outra chave primária, depois pode usar IDENTITY INSERT para preservar a chave.

Ver mais sobre o SET IDENTITY_INSERT no MSDN

 8
Author: pirho, 2012-09-30 06:03:22

Tenta isto

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

Depois

DELETE FROM TABLE1 WHERE Criteria
 3
Author: Adriaan Stander, 2009-10-23 09:17:50

Você deve ser capaz de o fazer com um subquery na instrução inserir.

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

Seguido de remoção do quadro 1.

Lembre-se de executá-la como uma única transacção para que, se alguma coisa correr mal, possa voltar a fazer a operação.
 3
Author: workmad3, 2009-10-23 09:18:23

Podes tentar isto:

SELECT * INTO tbl_NewTableName 
FROM tbl_OldTableName
WHERE Condition1=@Condition1Value

Depois execute uma remoção simples:

DELETE FROM tbl_OldTableName
WHERE Condition1=@Condition1Value
 2
Author: royse41, 2009-10-23 09:18:43

Use esta instrução sql única, que é segura sem necessidade de commit/rollback com várias declarações.

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

Funciona no servidor SQL faça as alterações apropriadas para o MySql

 1
Author: Dheerendra Kulkarni, 2017-09-13 06:13:54
Uma representação mais limpa do que algumas outras respostas sugeriram:
DELETE sourceTable
OUTPUT DELETED.*
INTO destTable (Comma, separated, list, of, columns)
WHERE <conditions (if any)>
 1
Author: GreySage, 2018-06-19 22:25:12

Se as duas tabelas usarem o mesmo ID ou tiverem uma chave única comum:

1) inserir o registo seleccionado no quadro 2

INSERT INTO table2 SELECT * FROM table1 WHERE (conditions)

2) apagar o registo seleccionado do quadro 1 se apresentar no quadro 2

DELETE FROM table1 as A, table2 as B WHERE (A.conditions) AND  (A.ID = B.ID)
 0
Author: user1847437, 2016-08-29 07:13:01

Aqui está como fazê-lo com uma única declaração

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

Exemplo:

    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
 0
Author: gpdude_, 2016-11-05 06:30:28

Pode utilizar "particionamento lógico" para mudar os dados entre tabelas:

Ao actualizar a coluna de Partição, os dados serão automaticamente movidos para a outra tabela:

Aqui está a amostra:

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
 0
Author: abdkok, 2016-11-28 20:14:22