Pregunta

Sé que el título puede parecer extraño, pero esto es lo que quiero hacer:

  1. Tengo mesa con muchos registros.
  2. Quiero obtener algunos de estos registros e insertarlos en otra tabla.Algo como esto:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. La parte complicada es que también quiero que estas filas que he insertado se eliminen de la tabla de origen.

¿Hay una manera fácil de hacer esto, porque lo único que he logrado hacer es usar una tabla temporal para guardar los registros seleccionados y luego colocarlos en la segunda tabla y eliminar las filas que coincidan con ellos de la primera tabla?Es una solución, pero con tantos registros( más de 3 millones y medio) estoy buscando alguna otra idea...

¿Fue útil?

Solución

En 2005 + uso OUTPUT cláusula como esta:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew
WHERE YourCondition

Se realizará en una sola transacción y se completará o revertirá simultáneamente

Otros consejos

Puede usar el insertar ... Salida cláusula para almacenarLa identificación de las filas copiadas en una tabla temporal.Luego, puede eliminar las filas de la tabla original en función de la tabla temporal.

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

Ejemplo de trabajo en Data Explorer.

Debes hacer algo como esto:

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

DELETE FROM "table1"
WHERE ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top