Jump to content


Photo

Mostrar registros de una tabla que no se encuentren en otra


  • Please log in to reply
13 replies to this topic

#1 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 posts
  • LocationMéxico D.F.

Posted 25 October 2012 - 03:21 PM

Pues eso amigo, tengo el siguiente problema!

Tengo dos tablas, Tabla1 y Tabla2, donde Tabla1 contiene un universo de registros (facturas) y en Tabla2 hay sólo las facturas que fueron pagadas con anticipación, quiero hacer un query que me muestre las facturas de la Tabla1 pero solo aquellas que no existan en la Tabla2.


SELECT
  *
FROM
  TABLA1
WHERE (CVE_FACT NOT IN (SELECT CVE_FACT FROM TABLA2))


Intente con el query anterior, pero se tarda horrores, alguien que pueda ayudarme. *-) *-) *-)

saludos y gracias de antemano. (y)

  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 25 October 2012 - 03:23 PM

¿Hacerlo desde un SP no te vale?.

Saludos.
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 25 October 2012 - 03:27 PM

hola amigo,

desgraciadamente la cláusula in de sql es tremendamente ineficiente... prueba este consulta y nos cuentas el resultado



  SELECT TABLA1.*
      FROM TABLA1
LEFT JOIN TABLA2
        ON TABLA1.CVE_FACT = TABLA2.CVE_FACT
WHERE TABLA2.CVE_FACT IS NULL


  • 0

#4 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 posts
  • LocationMéxico D.F.

Posted 25 October 2012 - 03:28 PM

¿Hacerlo desde un SP no te vale?.

Saludos.


Es Firebird...

gracias por contestar, saludos
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 25 October 2012 - 03:33 PM


¿Hacerlo desde un SP no te vale?.

Saludos.


Es Firebird...

gracias por contestar, saludos


¿?

Se supone que Firebird tiene Soporte para realizar Procedimientos Almacenados (SP), ¿o No?  :s
  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 25 October 2012 - 03:38 PM



¿Hacerlo desde un SP no te vale?.

Saludos.


Es Firebird...

gracias por contestar, saludos


¿?

Se supone que Firebird tiene Soporte para realizar Procedimientos Almacenados (SP), ¿o No?  :s


Sip, si tiene...

Saludox ! :)
  • 0

#7 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 posts
  • LocationMéxico D.F.

Posted 25 October 2012 - 04:02 PM




¿Hacerlo desde un SP no te vale?.

Saludos.


Es Firebird...

gracias por contestar, saludos


¿?

Se supone que Firebird tiene Soporte para realizar Procedimientos Almacenados (SP), ¿o No?  :s


Sip, si tiene...

Saludox ! :)


De hecho si tiene, pero cuando conteste estaba con una amiga y ya no supe que puse, lo siento.

Si tiene SP, pero al probar el query de Poli, me resulto mucho más fácil. gracias.

(y)

  • 0

#8 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 posts
  • LocationMéxico D.F.

Posted 25 October 2012 - 04:32 PM

hola amigo,

desgraciadamente la cláusula in de sql es tremendamente ineficiente... prueba este consulta y nos cuentas el resultado



Bien amigo, si resulto, esta un poco lento, pero creo que aquí lo que se debe considerar es que esta en red y hay más de 14 mil registros, jejeje.

gracias y saludos

  SELECT TABLA1.*
      FROM TABLA1
LEFT JOIN TABLA2
        ON TABLA1.CVE_FACT = TABLA2.CVE_FACT
WHERE TABLA2.CVE_FACT IS NULL



  • 0

#9 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 posts
  • LocationOaxaca, México

Posted 25 October 2012 - 04:39 PM

Bien amigo, si resulto, esta un poco lento, pero creo que aquí lo que se debe considerar es que esta en red y hay más de 14 mil registros, jejeje.

gracias y saludos

  SELECT TABLA1.*
      FROM TABLA1
LEFT JOIN TABLA2
        ON TABLA1.CVE_FACT = TABLA2.CVE_FACT
WHERE TABLA2.CVE_FACT IS NULL


Verifica el índices Razadi o recontrúyelos. Podría mejorar el rendimiento.

Saludos
  • 0

#10 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 25 October 2012 - 06:46 PM

Verifica el índices Razadi o recontrúyelos. Podría mejorar el rendimiento.

Saludos


Así es... como lo comenta nuestro amigo fredycc, hay que revisar que el campo cve_fact en ambas tablas esté indexado...
  • 0

#11 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 posts
  • LocationMar del Plata / Bs As / Argentina

Posted 26 October 2012 - 02:14 PM

proba esta:


SELECT DISTINCT T1.CVE_FACT
FROM TABLA1 t1 JOIN TABLA2 t2
ON T1.CVE_FACT = T2.CVE_FACT


*-)
  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 26 October 2012 - 02:25 PM

proba esta:


SELECT DISTINCT T1.CVE_FACT
FROM TABLA1 t1 JOIN TABLA2 t2
ON T1.CVE_FACT = T2.CVE_FACT


*-)


Pera esa consulta nos traería los datos de TABLA 1 que también están en TABLA 2 no ?... no es precisamente lo que se busca  ^o|

Saludox ! :)
  • 0

#13 LuNaTk

LuNaTk

    Newbie

  • Miembros
  • Pip
  • 8 posts

Posted 26 October 2012 - 03:20 PM

Quiza debas mirar un poco mas aya, pensando en el crecimiento de las tablas tu consulta con el paso del tiempo se hara mas lenta.

Porque no agregar un campo en Tabla1 que indique si fue pagada por anticipado y unicamente leer esta Tabla1 filtrandola por el campo sugerido para buscar el resultado que deseas.

No he manejado firebird, unicamente SQL Server, pero deberia tener soporte para triggers, para que al insertar un registro en Tabla2, actualizes el campo que te menciono en Tabla 1.

En SQL server hacer lo que tu estás haciendo leyendo ambas tablas implica un escaneo de todos los registros de la tabla, lo cual es extremadamente ineficiente, desconozco el motor de firebird pero seguramente hace algo similar, asi que noe staria mál pensar en lo que te comente.

bueno saludos.
  • 0

#14 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 27 October 2012 - 08:47 AM

En SQL server hacer lo que tu estás haciendo leyendo ambas tablas implica un escaneo de todos los registros de la tabla, lo cual es extremadamente ineficiente, desconozco el motor de firebird pero seguramente hace algo similar, asi que noe staria mál pensar en lo que te comente.


Esto es un muy dato a considerar... como bien dice LunaTk, es importante analizar las tablas y establecer llaves primarias e índices para conseguir un rendimiento óptimo...
  • 0




IP.Board spam blocked by CleanTalk.