Juntar dos tablas en una

10/09/2005 - 01:20 por Alfredo Crisostomo | Informe spam
Hola, tengo dos tablas grandes que debo juntarlas en una sola pero no cuento
con suficiente espacio para duplicar los registros con un simple insert y
despues borrarla. Son millones de registros.

Que opciones tengo para hacer eso de manera eficiente ?

Preguntas similare

Leer las respuestas

#1 Isaias
10/09/2005 - 02:16 | Informe spam
Si solo las quieres "juntar" en un select

SELECT * FROM MyTabla1
UNION
SELECT * FROM MyTabla2

Ahora, si quieres que solo quede una sola tabla y no cuentas con espacio
(¿?) suficiente para hacer este movimiento, pues no se me ocurre nada mas que
lo hagas por bloques de registros, esto es, a mano.
Respuesta Responder a este mensaje
#2 Alejandro Mesa
10/09/2005 - 02:33 | Informe spam
Alfredo,

Puedes hacerlo por bloques de filas, usando la clave primaria como punto de
referencia.

Ejemplo:

while exists (select * from t2)
begin

begin transaction

insert into t1 (c1, c2, c3)
select c1, c2, c3
from t2 as a
where (select count(*) from t2 as b where b.c1 <= a.c1) <= 10000

delete t2
where (select count(*) from t2 as a where a.c1 <= t2.c1) <= 10000

commit transaction
end
go

Recuerda manejar los errores.


AMB

"Alfredo Crisostomo" wrote:

Hola, tengo dos tablas grandes que debo juntarlas en una sola pero no cuento
con suficiente espacio para duplicar los registros con un simple insert y
despues borrarla. Son millones de registros.

Que opciones tengo para hacer eso de manera eficiente ?



Respuesta Responder a este mensaje
#3 Alfredo Crisostomo
10/09/2005 - 06:44 | Informe spam
el problemilla es que son todavia tablas crudas sin clave primaria todavia.
Deberia crear el indice primero entonces ?

"Alejandro Mesa" escribió en el
mensaje news:
Alfredo,

Puedes hacerlo por bloques de filas, usando la clave primaria como punto
de
referencia.

Ejemplo:

while exists (select * from t2)
begin

begin transaction

insert into t1 (c1, c2, c3)
select c1, c2, c3
from t2 as a
where (select count(*) from t2 as b where b.c1 <= a.c1) <= 10000

delete t2
where (select count(*) from t2 as a where a.c1 <= t2.c1) <= 10000

commit transaction
end
go

Recuerda manejar los errores.


AMB

"Alfredo Crisostomo" wrote:

Hola, tengo dos tablas grandes que debo juntarlas en una sola pero no
cuento
con suficiente espacio para duplicar los registros con un simple insert y
despues borrarla. Son millones de registros.

Que opciones tengo para hacer eso de manera eficiente ?



Respuesta Responder a este mensaje
#4 Alejandro Mesa
10/09/2005 - 14:51 | Informe spam
Alfredo,

el problemilla es que son todavia tablas crudas sin clave primaria todavia.
Deberia crear el indice primero entonces ?



Crudas o cocinadas, toda tabla debe tener una clave primaria, es la base de
la teoria de las bases de datos relacionales, de lo contrario debes revisar
su esquema y normalizar la tabla si es necesario.

Si sabes que columna(s) conforman la clave primaria, entonces crea un
restriccion de clave primaria a nivel de tabla, usando la sentencia "alter
table". Si aun no has identificado la(s) columna(s) que conforman la clave
primaria, entonces adiciona una columna nueva con propiedad "identity", sql
server la iniciara con data una vez agregada. Crea un indice clustered unico
por esta columna y usala como referencia, no tienes que adicionarla a la otra
tabla.

Ejemplo:

use northwind
go

select top 50 percent
cast(orderid as int) as orderid, customerid, orderdate
into
t1
from
dbo.orders
order by
orderid asc

declare @i int

set @i = (select max(orderid) from t1)

select
cast(orderid as int) as orderid, customerid, orderdate
into
t2
from
dbo.orders
where
orderid > @i
go

alter table t2
add c1 int not null identity(1, 1)
go

alter table t2
add constraint u_t2_c1 unique clustered (c1 asc)
go

while exists(select * from t2)
begin

begin transaction

insert into t1(orderid, customerid, orderdate)
select orderid, customerid, orderdate
from t2 as a
where (select count(*) from t2 as b where b.c1 <= a.c1) <= 50

delete t2
where (select count(*) from t2 as a where a.c1 <= t2.c1) <= 50

commit transaction

end
go

select count(*) as t1_cnt from t1
select count(*) as t2_cnt from t2
go

drop table t2, t1
go


AMB

"Alfredo Crisostomo" wrote:

el problemilla es que son todavia tablas crudas sin clave primaria todavia.
Deberia crear el indice primero entonces ?

"Alejandro Mesa" escribió en el
mensaje news:
> Alfredo,
>
> Puedes hacerlo por bloques de filas, usando la clave primaria como punto
> de
> referencia.
>
> Ejemplo:
>
> while exists (select * from t2)
> begin
>
> begin transaction
>
> insert into t1 (c1, c2, c3)
> select c1, c2, c3
> from t2 as a
> where (select count(*) from t2 as b where b.c1 <= a.c1) <= 10000
>
> delete t2
> where (select count(*) from t2 as a where a.c1 <= t2.c1) <= 10000
>
> commit transaction
> end
> go
>
> Recuerda manejar los errores.
>
>
> AMB
>
> "Alfredo Crisostomo" wrote:
>
>> Hola, tengo dos tablas grandes que debo juntarlas en una sola pero no
>> cuento
>> con suficiente espacio para duplicar los registros con un simple insert y
>> despues borrarla. Son millones de registros.
>>
>> Que opciones tengo para hacer eso de manera eficiente ?
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida