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


La franja horaria es GMT +2. Ahora son las 06:16:53.

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