Pergunta

Eu sei que o título pode parecer estranho, mas é isso que eu quero fazer:

  1. Tenho tabela com muitos registros.
  2. Quero pegar alguns desses registros e inseri-los em outra tabela.Algo assim:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. A parte complicada é que quero que essas linhas que inseri sejam excluídas da tabela de origem também.

Existe uma maneira fácil de fazer isso, porque a única coisa que consegui fazer foi usar uma tabela temporária para salvar os registros selecionados e depois colocá-los na segunda tabela e excluir as linhas que correspondem a eles da primeira tabela .É uma solução, mas com tantos registos (mais de 3 milhões e meio) estou à procura de outra ideia...

Foi útil?

Solução

Em 2005+ uso OUTPUT cláusula como esta:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew
WHERE YourCondition

Será realizado em uma única transação e concluído ou revertido simultaneamente

Outras dicas

Você pode usar o inserir ...saída cláusula para armazenar os IDs das linhas copiadas em uma tabela temporária.Então você pode excluir as linhas da tabela original com base na tabela temporária.

declare @Table1 table (id int, name varchar(50))
declare @Table2 table (id int, name varchar(50))

insert @Table1 (id,name)
          select 1, 'Mitt'
union all select 2, 'Newt'
union all select 3, 'Rick'
union all select 4, 'Ron'


declare @copied table (id int)

insert  @Table2
        (id, name)
output  inserted.id 
into    @copied
select  id
,       name
from    @Table1
where   name <> 'Mitt'

delete  @Table1
where   id in 
        (
        select  id 
        from    @copied
        )

select  *
from    @Table1

Exemplo de trabalho no Data Explorer.

Você deveria fazer algo assim:

INSERT INTO "table1" ("column1", "column2", ...)
SELECT "column3", "column4", ...
FROM "table2" 
WHERE ...

DELETE FROM "table1"
WHERE ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top