Question

Je sais que le titre peut sembler étrange, mais c'est ce que je veux faire:

  1. J'ai une table avec de nombreux enregistrements.
  2. Je veux obtenir certains de ces enregistrements et les insérer dans une autre table. Quelque chose comme ça:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. La partie délicate est que je veux que ces lignes que j'ai insérées soient également supprimées de la table d'origine.

Y a-t-il un moyen facile de le faire, car la seule pensée que j'ai réussi à faire est d'utiliser une table temporaire pour enregistrer les enregistrements sélectionnés, puis les mettre dans le deuxième tableau et supprimer les lignes qui correspondent à eux du premier tableau . C'est une solution, mais avec tant de disques (plus de 3 millions et moitié), je recherche une autre idée ...

Était-ce utile?

La solution

En 2005+ Utiliser OUTPUT clause comme ceci:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew
WHERE YourCondition

Il sera effectué en transaction unique et soit terminé ou reculer simultanément

Autres conseils

Vous pouvez utiliser le insérer ... clause pour stocker les identifiants des lignes copiées dans une table temporaire. Ensuite, vous pouvez supprimer les lignes de la table d'origine en fonction de la table temporaire.

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

Exemple de travail chez Data Explorer.

Vous devriez faire quelque chose comme ceci:

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

DELETE FROM "table1"
WHERE ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top