Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   insert into tabla values (select *... ¿? (https://www.clubdelphi.com/foros/showthread.php?t=30410)

jorgesl 05-04-2006 17:20:51

insert into tabla values (select *... ¿?
 
Hola, que tal.
Tengo un TQuery con la siguiente instruccion SQL:

Código SQL [-]
select * from SOSTAT_RESUL where SOSTAT_RESUL.PNTNAM like :nomenclatura and SOSTAT_RESUL.SUBNAM like :sSubE order by SOSTAT_RESUL.PNTNAM

Esa instruccion me regresa una serie de registros que estan almacenados en una tabla y esos registros, necesito insertarlos en otra tabla.

El problema es que esos registros tienen muchísimos campos (como 70) y seria muy dificil hacer insert into tabla values (x1,x2,x3, ....,x70);.. se imaginan ?

Mi pregunta es saber si puedo hacer algo como:
Código SQL [-]
insert into tabla values (select * from SOSTAT_RESUL where SOSTAT_RESUL.PNTNAM like :nomenclatura and SOSTAT_RESUL.SUBNAM like :sSubE order by SOSTAT_RESUL.PNTNAM);

y como es uqe hay que hacerlo.

O que otra opción me dan.

Uso delphi 2006 y la base de datos esta en Access
Gracias !

Kosmo 05-04-2006 17:39:21

Creo que se puede hacer mas o menos como tu has dicho:

Código SQL [-]
 
INSERT INTO MiTabla SELECT Campo1,Campo2,Campo3 FROM OtraTabla WHERE MiCampo='X'

Creo que algo asi funcionaría, sin poner "Values".

Además de esa versión, en caso de que la tabla no este creada, también tienes otra manera de hacerlo (que al menos funciona con bases de datos oracle, no se si con el resto también).

Código SQL [-]
 
SELECT * FROM MiTabla AS NuevaTabla

Eso lo que haría sería crearte una tabla con las columnas necesarias utilizando el mismo tipo de datos que las columnas de la tabla origen seleccionadas.

Espero te sirva

Bicho 05-04-2006 17:41:06

Hola pasata por aquí.

Saludos

vtdeleon 05-04-2006 17:43:18

Saludos
Cita:

Empezado por jorgesl
Mi pregunta es saber si puedo hacer algo como:
Código SQL [-]
insert into tabla values (select * from SOSTAT_RESUL where SOSTAT_RESUL.PNTNAM like :nomenclatura and SOSTAT_RESUL.SUBNAM like :sSubE order by SOSTAT_RESUL.PNTNAM);

Si se puede, siempre que la consulta "Select" arroje la misma cantidad de campos que la tabla en "Insert". Si por alguna razon tienes insertar solo 60 campos (ej.) lamentablemente tendras que especificar cada campo.

Cita:

Empezado por jorgesl
y como es uqe hay que hacerlo.

Como lo veo arriba esta bien y como te escribi mas arriba: Campo en Inset = Campo en Select :D

FOURIER 05-04-2006 21:15:05

Esa serìa la manera
 
insert into tabla(CamposAgregar) select CamposAgregar from SOSTAT_RESUL where SOSTAT_RESUL.PNTNAM like :nomenclatura and SOSTAT_RESUL.SUBNAM like :sSubE order by SOSTAT_RESUL.PNTNAM;

jorgesl 05-04-2006 21:54:38

Hago lo sigueinte:

Código Delphi [-]
       {}Qinte := TQuery.Create(Self);
        {}Qinte.DatabaseName := 'Objetos';
        {}Qinte.RequestLive := True;
        {}Qinte.Close;
        {}Qinte.SQL.Text := 'insert into SOSTAT_RESUL_ORDEN (select * from SOSTAT_RESUL where SOSTAT_RESUL.PNTNAM like :interruptor)';
        {}Qinte.Prepare;
        {}Qinte.ParamByName('interruptor').AsString := interruptor;
        {}Qinte.Open;
pero en Qinte.Prepare;

Marca el siguiente error:
Código:

'Invalid use of keyword.
Token: select
Line Number: 1.'

Si quito los parentesis entre lso que esta el select, el error que me marca dice: 'Capability not supported'

jorgesl 06-04-2006 20:03:25

Vi un error que tengo:

Debo de hacer ExcecSQL en lugar de Open.
Pero igual sigue sin funcionar.

El error me lo da en el prepare.

Quice hacer la prueba simplemente haciendo
Código SQL [-]
insert into SOSTAT_RESUL (PNTNAM) values ("PRUEBA")

pero al llegar al momento donde se ejecuta el query, me dice que la tabla es de solo lectura...
Pero la tabla no es de solo lectura...

Ya me desespero ese error... es lo único que me falta para terminar mi proyecto :(

JOSEA 06-04-2006 20:50:41

Hola a todos.
Supongo que las dos tablas tendran campos similares, si es asi puede que te sirva esto (es un poco basto):
Código:

  query1.open;
  tablasegunda.BatchMove(query1,batappend);
  query1.close;


jorgesl 06-04-2006 22:24:01

Genial !!
eso si funcionó a las mil maravillas !!

Gracias !

jorgesl 07-04-2006 20:06:41

Hmm...

Creo que habñé demasiado rápido.

Con esa solución sí pude insertar los campos en la otra tabla, pero tiene un detalle.

El módulo que estoy haciendo, toma los registros de una tabla, los ordena de acuerdo a cierto criterio (muy especial y extraño, por cierto) y los inserta en otra tabla ya ordenados.

EL ordenamiento lo logro hacer en memoria, los datos los muestra ordenados por medio de un treeview (...ó Memo ó StringGrid). Por lo que la instrucci´pn de BatchMove la puse antes de hacer que la clave en la que estaba se mostrara en le programa, para que según yo, se insertaran en la tabla de la misma forma que se "insertan" en el StringGrid por ejemplo.

Pero la inserción en la tabla la hace de una forma completamente diferente, de hecho, creo que los campos los ingresa ordenados alfabeticamente (es así o será que solo estoy paranoico).

O acasi asi funciona esa función ?

jorgesl 07-04-2006 20:10:58

Hey !!
SI, definitivamente si los ordena en orden alfabetico...
Hay alguna forma de que los ingrese secuencialmente ??

JOSEA 07-04-2006 22:33:30

Hola jorgesl:
No estoy muy seguro, pero si en la tabla que recibe los datos no tiene indices, creo que lo ingresará con el "order by" que tengas puesto en la Query.

JOSEA 07-04-2006 22:42:14

Definitivamente si jorgesl.
Hice la prueba ordenando por varios campos y los ingresa por el orden de la Query. Tambien lo hice sin poner order by en la Query y los inserta en el orden que encuentra en la tabla.

jorgesl 10-04-2006 16:36:41

Esto es parte de lo que hago:

Código Delphi [-]
with query do
begin

...

      insSQL:='select * from SOSTAT_RESUL where PNTNAM like :parametro and SUBNAM like :sSubE AND OBJNAM like "SUBESTACION%" order by PNTNAM';
      SQL.Text:= insSQL;
      Prepare;
      ParamByName('sSubE').AsString := sSubE;
      parametro := tipo + '-%';
      ParamByName('parametro').AsString := parametro;
      Open;
      First;
      while not EoF do
      begin
        objeto := FieldByName('PNTNAM').AsString;
        {}Qinte.SQL.Text := 'select * from SOSTAT_RESUL where PNTNAM like :objeto';
        {}Qinte.Prepare;
        {}Qinte.Prepare;
        {}Qinte.ParamByName('objeto').AsString := objeto;
        {}Qinte.Open;
        {}Table1.BatchMove(Qinte,batappend);
        {}Table1.Next;
        {}Qinte.Close;
...

end

Hay alguna manera de hacer que esa instruccion los agregue en el orden que los vaya encontrando en el query ?
osea, uno abajo del otro :P

Es lo unico que que necesito, con insert no funciona y lo que requiero es un insert, que siemrpe los reguistros los agregue al final de la tabla...

Esa instruccion sirve para mover el contenido de una tabla a otra, pero yo lo hago con un query, el contenido del query lo muevo a la tabla destino y el query, siempre me regresa un solo registro.

jorgesl 11-04-2006 15:50:01

Sigo con el mismo prblema.
Ya traté haciendo
Código Delphi [-]
        {}Table1.BatchMove(Qinte,batCopy);

Pero al final, sólo deja la tabla con un registro (el último)

jorgesl 11-04-2006 21:29:08

Algo muy raro ha pasado.

De repente funciono...
Código Delphi [-]
        {}Qinte.SQL.Text := 'select * from SOSTAT_RESUL where PNTNAM like :objeto';
        {}Qinte.Prepare;
        {}Qinte.ParamByName('objeto').AsString := objeto;
        {}Qinte.Open;
        {}Table1.BatchMove(Qinte,batAppend);
        {}Table1.Next;
        {}Qinte.Close;

Pero ahora quiero implementarlo en otra función... y lo hace mal de nuevo...
No entiendo
lo unico que cambia es Table1 por Table2...

Esta embrujado mi DevStudo 2006?:eek:


La franja horaria es GMT +2. Ahora son las 02:09:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi