Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Instrucción INSERT INTO no me funciona bien (https://www.clubdelphi.com/foros/showthread.php?t=76471)

newtron 03-11-2011 19:12:03

Instrucción INSERT INTO no me funciona bien
 
Hola a tod@s.

Tengo tres tablas:

BORRADOR1
IVAREPERCUTIDO
IVARBORRADOR1

Las tablas IVAREPERCUTIDO y IVARBORRADOR1 son exactamente iguales.

Ejemplo de registros:

Código:

BORRADOR1

Asiento Apunte Fecha      Importe REPSOP
      1      1 01/01/2011    100 00000001
      2      1 01/01/2011    150 00000002
      3      1 01/01/2011    500 00000003

IVARBORRADOR1

CODIGO  Fecha      Factura Importe
00000001 01/01/2011 1          100
00000002 01/01/2011 2          150
00000003 01/01/2011 3          500
00000004 01/01/2011 4          300


El campo REPSOP de la tabla BORRADOR1 se relaciona con el campo CODIGO de la tabla IVARBORRADOR1.

El tema está en que quiero insertar en la tabla IVAREPERCUTIDO los registros de la tabla IVARBORRADOR1 en los que el campo CODIGO no se encuentre en el campo REPSOP de la tabla BORRADOR1.

Estoy ejecutando la siguiente instrucción:

Código SQL [-]
INSERT INTO IVAREPERCUTIDO SELECT * FROM IVARBORRADOR1 WHERE IVARBORRADOR1.CODIGO NOT IN (SELECT REPSOP FROM BORRADOR1 WHERE IVARBORRADOR1.CODIGO=BORRADOR1.REPSOP)


pero me coge todos los registros cuando solo me tendría que coger en este caso el codigo 00000004 que es el que no se encuentra en la tabla BORRADOR1.

¿Algún amable gurú del SQL me puede decir dónde estoy metiendo la pata?

Gracias y un saludo

Caral 03-11-2011 19:26:58

Hola
Lo de guru con migo no, pero creo que lo que pasa es que hacer una seleccion de todos los campos de una tabla y luego haces una seleccion de un solo campo en la segunda tabla, para insertarla en la tercera.
Tu sentencia:
Código Delphi [-]
INSERT INTO IVAREPERCUTIDO SELECT * FROM IVARBORRADOR1 WHERE IVARBORRADOR1.CODIGO NOT IN 
(SELECT REPSOP FROM BORRADOR1 WHERE IVARBORRADOR1.CODIGO=BORRADOR1.REPSOP)
Me parece:
Código Delphi [-]
INSERT INTO IVAREPERCUTIDO (SELECT * FROM IVARBORRADOR1 WHERE IVARBORRADOR1.CODIGO NOT IN 
(SELECT * FROM BORRADOR1 WHERE IVARBORRADOR1.CODIGO = BORRADOR1.REPSOP))
Saludos
PD: Creo que seria mejor hacer la comparacion primero, colocarla en una tabla temporal y luego insertarla en la que se necesite.

newtron 03-11-2011 19:39:27

Gracias amigo Caral pero esos paréntesis no le gustan a mi base de datos, me da error. Tendré que buscar otra forma.

Gracias y un saludo

Caral 03-11-2011 19:44:19

Hola
Por curiosidad y sin los parentesis ?.
Saludos

newtron 03-11-2011 19:55:36

Tampoco. :)

Casimiro Notevi 03-11-2011 20:01:26

También me he encontrado en algunas ocasiones que para ese tipo de sentencia "compuesta" me salta un mensaje de error, de que no es correcta. Ponga o quite los paréntesis, no funciona.
Sin embargo, en otras ocasiones funciona correctamente.
No he sido capaz de encontrar un "patrón" para identificar de donde proviene el problema.
Aunque tampoco lo he buscado mucho :confused:

newtron 03-11-2011 20:03:02

Cita:

Empezado por Casimiro Notevi (Mensaje 417510)
No he sido capaz de encontrar un "patrón"...

Pues si no hay patrón, menos un marinero. :p

Casimiro Notevi 03-11-2011 20:06:41

Cita:

Empezado por newtron (Mensaje 417512)
Pues si no hay patrón, menos un marinero. :p

Pensé que en estos asuntos tú eres un patrón y yo soy un marinero. Tuve una época de patrón, pero me "quemé" y volví a ser marinero.
Ahora quiero volver a ser de nuevo un patrón, aunque está bien difícil.

newtron 03-11-2011 20:10:07

Cita:

Empezado por Casimiro Notevi (Mensaje 417514)
Pensé que en estos asuntos tú eres un patrón y yo soy un marinero. Tuve una época de patrón, pero me "quemé" y volví a ser marinero.
Ahora quiero volver a ser de nuevo un patrón, aunque está bien difícil.

Si que lo soy, precisamente en enero hago 20 años de patrón, ya os invitaré a algo. :p

Lo que pasa es que yo creo que llegué en el momento adecuado al sitio adecuado y la verdad es que no me ha ido mal. Ahora son otros tiempos y está la cosa bastante más complicada, y más que se está poniendo.

Casimiro Notevi 03-11-2011 20:16:53

Hace 20 años... en el 1991, pues más o menos igual, yo "me hice patrón" en el 1988, aunque por diversos motivos no publicables en público, tuve que dejarlo varios años después.

newtron 03-11-2011 20:23:20

Bueno, el problema de esto es que para salir a la calle tienes que llevar un muy buen producto ya terminado y empezar a hacerte un mercado, y ahora eso está complicado.

Hace 20 años cualquier programa perruno que no funcionaba lo vendías a millón y no pasaba nada. El panorama ha cambiado bastante, hay que llevar productos bien acabados, potentes, muy funcionales y encima luchar para venderlo contra otros cientos que como tú están en la calle o en internet vendiendo lo mismo.

Casimiro Notevi 03-11-2011 20:35:52

Cierto, hoy en día la venta de un producto software es dificilísimo. Hay que recurrir a otros enfoques, como ofrecer servicios variados, principalmente.

newtron 04-11-2011 09:38:31

Cita:

Empezado por Casimiro Notevi (Mensaje 417522)
Cierto, hoy en día la venta de un producto software es dificilísimo. Hay que recurrir a otros enfoques, como ofrecer servicios variados, principalmente.

Si, yo llevo algún tiempo ofreciendo servicios sexuales pero no me sale mucha faena. :D

P.D. uis.... creo que nos estamos desviando "algo" del tema. :D

Casimiro Notevi 04-11-2011 10:59:48

Cita:

Empezado por newtron (Mensaje 417563)
Si, yo llevo algún tiempo ofreciendo servicios sexuales pero no me sale mucha faena. :D
P.D. uis.... creo que nos estamos desviando "algo" del tema. :D

También puedes alquilar el "servicio" del negocio, pones un letrero: "Servicios públicos: un pis 1 euro; un pos 3 euros", lo mismo funciona :)

ElDioni 04-11-2011 11:12:50

Prueba con esto.

Código SQL [-]
INSERT INTO IVAREPERCUTIDO SELECT DISTINCTROWIVARBORRADOR1.* FROM IVARBORRADOR1 LEFT JOIN BORRADOR1 ON IVARBORRADOR1.REPSOP = BORRADOR1.CODIGOWHERE (((BORRADOR1.CODIGO) Is Null));

Saludos.

newtron 04-11-2011 13:32:48

Cita:

Empezado por ElDioni (Mensaje 417579)
Prueba con esto.

Código SQL [-]INSERT INTO IVAREPERCUTIDO SELECT DISTINCTROWIVARBORRADOR1.* FROM IVARBORRADOR1 LEFT JOIN BORRADOR1 ON IVARBORRADOR1.REPSOP = BORRADOR1.CODIGOWHERE (((BORRADOR1.CODIGO) Is Null));


Saludos.

Nada, me da este error:
Código SQL [-]
ElevateDB Error #700 An error was found in the statement at line 2 and column 33 (Expected FROM but instead found .)

Gracias

ElDioni 04-11-2011 16:27:15

¿Y así?

Código SQL [-]
INSERT INTO IVAREPERCUTIDO SELECT * FROM  IVARBORRADOR1 LEFT JOIN BORRADOR1 ON IVARBORRADOR1.REPSOP =  BORRADOR1.CODIGO WHERE BORRADOR1.CODIGO Is Null;

Saludos.

newtron 04-11-2011 17:23:10

Cita:

Empezado por ElDioni (Mensaje 417607)
¿Y así?

Código SQL [-]INSERT INTO IVAREPERCUTIDO SELECT * FROM IVARBORRADOR1 LEFT JOIN BORRADOR1 ON IVARBORRADOR1.REPSOP = BORRADOR1.CODIGO WHERE BORRADOR1.CODIGO Is Null;


Saludos.

Negativo, también me da error

ElDioni 04-11-2011 18:39:38

¿Te da error si haces la consulta por separado sin el insert?

Código SQL [-]
SELECT * FROM  IVARBORRADOR1 LEFT JOIN BORRADOR1 ON IVARBORRADOR1.REPSOP =  BORRADOR1.CODIGO WHERE BORRADOR1.CODIGO Is Null

lo digo por descartar algo.

Si no te da error puedes, aunque sea guarrear un poco, meter los datos uno a uno con un while.

Saludos.

newtron 04-11-2011 19:15:29

Bueno, con esto no da error pero me trae todos los registros. Iré pensando en hacerlo por código.

Gracias

Casimiro Notevi 04-11-2011 20:03:02

Si no he entendido mal, lo que quieres hacer sería esto:

Código SQL [-]
insert into ivarepercutido (
    select *  
    from ivarborrador1
    where codigo not in (select repsop from borrador1)
)

Ahora bien, que te funcione o no, eso es otra cosa :)

newtron 04-11-2011 20:43:26

Cita:

Empezado por Casimiro Notevi (Mensaje 417632)
Si no he entendido mal, lo que quieres hacer sería esto:

Código SQL [-]insert into ivarepercutido ( select * from ivarborrador1 where codigo not in (select repsop from borrador1) )


Ahora bien, que te funcione o no, eso es otra cosa :)

Pues no funciona, mi gozo en un pozo. :)

oscarac 04-11-2011 20:47:09

Cita:

Empezado por newtron (Mensaje 417639)
Pues no funciona, mi gozo en un pozo. :)

te sale algun mensaje?
que base de datos usas?

newtron 05-11-2011 09:16:45

Cita:

Empezado por oscarac (Mensaje 417640)
te sale algun mensaje?
que base de datos usas?

En esta última instrucción no da error, simplemente no hace nada, en las anteriores si que daba errores como de sintaxis.

La base de datos que uso es ElevateDB, que a todos vosotros os sonará a chino, posiblemente si hubiera aterrizado por aquí hace unos años usaría firebird. :D

Casimiro Notevi 05-11-2011 12:46:06

Cita:

Empezado por newtron (Mensaje 417681)
En esta última instrucción no da error, simplemente no hace nada

¿Y no puede ser que haya funcionado entonces?, y el "no hace nada" es que no hay nada que insertar con ese filtro (where) o que no hayas hecho 'commit' tras ejecutar la sentencia.
Por preguntar.

newtron 05-11-2011 12:56:13

Cita:

Empezado por Casimiro Notevi (Mensaje 417684)
¿Y no puede ser que haya funcionado entonces?, y el "no hace nada" es que no hay nada que insertar con ese filtro (where) o que no hayas hecho 'commit' tras ejecutar la sentencia.
Por preguntar.

Bueno, me puedo haber equivocado pero no creo porque registros a insertar con esas condiciones hay (creo) e hice commit seguro.

De todas formas volveré a probar por si acaso me equivoco (aunque tengo claro que eso es bastante improbable :p)

Casimiro Notevi 05-11-2011 13:02:17

Cita:

Empezado por newtron (Mensaje 417686)
De todas formas volveré a probar por si acaso me equivoco (aunque tengo claro que eso es bastante improbable :p)

Por supuesto, nosotros nunca nos equivocamos :)
Es el ordenador que ha fallado, o el windows ha hecho algo raro, o la conjunción de planetas... :)

ElDioni 07-11-2011 10:32:30

Yo que se que puede estar pasando, ¿tienes access instalado o algún otro programa de bbdd?, lo digo por hacer una prueba simple de crear las tablas en otro motor y probar las consultas que te hemos propuesto.

Saludos.

newtron 07-11-2011 10:38:29

Cita:

Empezado por ElDioni (Mensaje 417778)
Yo que se que puede estar pasando, ¿tienes access instalado o algún otro programa de bbdd?, lo digo por hacer una prueba simple de crear las tablas en otro motor y probar las consultas que te hemos propuesto.

Saludos.

Si pero la verdad es que no me solucionaría gran cosa que en otra base de datos funcionara, es posible que haya pequeñas variaciones de sintaxis entre unas bases de datos y otras en las instrucciones sql. No te apures, ya lo haré por código.

Gracias y un saludo

newtron 07-11-2011 14:02:20

:o

Cita:

Empezado por newtron (Mensaje 417686)
Bueno, me puedo haber equivocado pero no creo porque registros a insertar con esas condiciones hay (creo) e hice commit seguro.

De todas formas volveré a probar por si acaso me equivoco (aunque tengo claro que eso es bastante improbable :p)

Aunque podría callarme :D tengo que confesar que esta última instrucción de casimiro si que iba, pero en las pruebas que hice no sacaba nada porque con los datos que había debía hacerlo así. Después he estado haciendo más pruebas y me he dado cuenta del fallo con los datos de prueba.

Gracias por vuestra atención y un saludo

Casimiro Notevi 07-11-2011 14:39:06

Pues que sepas que me habías bajado mi autoestima :p y que no como ni duermo desde entonces.
Me voy a comer... :D

newtron 07-11-2011 17:03:23

Cita:

Empezado por Casimiro Notevi (Mensaje 417809)
Pues que sepas que me habías bajado mi autoestima :p y que no como ni duermo desde entonces.
Me voy a comer... :D

Pobre... mándame la factura del psicólogo, no hay problema. :p

Casimiro Notevi 07-11-2011 17:07:44

Entonces, (tonterías aparte), ¿has conseguido lo que querías con el sql?

newtron 07-11-2011 18:43:28

Cita:

Empezado por Casimiro Notevi (Mensaje 417821)
Entonces, (tonterías aparte), ¿has conseguido lo que querías con el sql?

Si, ya te digo que tu instrucción es correcta, probandola me he dado cuenta de que el problema estaba en había un fallo en los datos de prueba, la mía original también es correcta pero más rebuscada que la tuya.

Casimiro Notevi 07-11-2011 19:35:05



Por fin voy a poder dormir tranquilo :)

olbeup 08-11-2011 09:11:42

Prueba esto :D
Código SQL [-]
INSERT INTO IVAREPERCUTIDO
  SELECT * 
    FROM IVABORRADOR1
    WHERE CODIGO NOT IN (SELECT REPSOP FROM BORRADOR1)

Un saludo.

P.D.: Me encanta escribir código SQL

newtron 09-11-2011 09:19:32

Cita:

Empezado por olbeup (Mensaje 417873)
Prueba esto :D
Código SQL [-]INSERT INTO IVAREPERCUTIDO SELECT * FROM IVABORRADOR1 WHERE CODIGO NOT IN (SELECT REPSOP FROM BORRADOR1)


Un saludo.

P.D.: Me encanta escribir código SQL

¿Esta no es igual que la de casimiro?

Casimiro Notevi 09-11-2011 10:39:05

Cita:

Empezado por newtron (Mensaje 417965)
¿Esta no es igual que la de casimiro?

No, mi código está en minúsculas, es diferente, dónde vas a parar :)

newtron 09-11-2011 11:32:03

Cita:

Empezado por Casimiro Notevi (Mensaje 417972)
No, mi código está en minúsculas, es diferente, dónde vas a parar :)

Oh.... es verdad.... lo he comprobado y con el código en minúsculas va más rápido. :p

ElDioni 09-11-2011 17:26:51

Hola newtron, solo preguntarte si tuviste oportunidad de probar la primera opción que te indiqué, solo por saber si también funciona, me corroe la curiosidad.

Saludos.


La franja horaria es GMT +2. Ahora son las 11:12:00.

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