Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Listar registros de una Tabla que NO estan en Otra... (https://www.clubdelphi.com/foros/showthread.php?t=82881)

darkamerico 22-04-2013 17:45:39

Listar registros de una Tabla que NO estan en Otra...
 
Precisamente este es mi problema, tengo dos tablas y deseo realizar una consulta SQL que liste solamente aquellos registros que se encuentran en una de ellas y no se encuentren en la otra.

La Tabla llamada: fise_usuarioxsumin, es la tabla donde existen registros que NO existen en la otra tabla: fise_transicion.

No soy muy bueno en SQL, sin embargo encontre la siguiente forma de SQL que podria resolver el problema:

Código SQL [-]
Select * from t1 where not exists (select 1 from t2 where t2.id = t1.id)

Ambas tablas almacenan informacion por mes y año, lo cual debo tomar en cuenta ( anio='2013' and mes='03' ) por ejemplo.

La estructura de fise_usuarioxsumin es la siguiente:

Código SQL [-]
CREATE TABLE `fise_usuarioxsumin` (
  `idusuarioxsum` int(11) NOT NULL,
  `idusuario_fk` int(11) NOT NULL,
  `rc` varchar(16) NOT NULL,
  `idsuminid_fk` int(11) NOT NULL,
  `idcocina` int(11) NOT NULL,
  `estado` tinyint(4) NOT NULL,
  `anio` varchar(4) NOT NULL,
  `mes` varchar(2) NOT NULL,
  `benef_ApePat` varchar(40) NOT NULL,
  `benef_ApeMat` varchar(40) NOT NULL,
  `benef_Nombres` varchar(40) NOT NULL,
  `benef_DNI` varchar(8) NOT NULL,
  PRIMARY KEY (`idusuarioxsum`),
  KEY `AnioMes` (`anio`,`mes`) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Y la estructura de la otra tabla es:

Código SQL [-]
CREATE TABLE `fise_transicion` (
  `id` int(11) NOT NULL,
  `rc` varchar(16) NOT NULL,
  `prop_nombre` varchar(100) NOT NULL,
  `prop_dni` varchar(8) NOT NULL,
  `benef_ApePat` varchar(40) NOT NULL,
  `benef_ApeMat` varchar(40) NOT NULL,
  `benef_Nombres` varchar(40) NOT NULL,
  `benef_DNI` varchar(8) NOT NULL,
  `glosa` varchar(255) NOT NULL,
  `tiene_cocina` char(1) NOT NULL,
  `anio` varchar(4) NOT NULL,
  `mes` varchar(2) NOT NULL,
  `estado` char(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Por favor alguien que me ayude con este tema, mi aplicacion esta parada mientras tanto.


Gracias

Americo

Neftali [Germán.Estévez] 22-04-2013 18:06:01

Prueba ha realizar una LEFT JOIN de la primera con la segunda; Eso te debería dar TODOS los registros de la primera y la relación que tienen con los de la segunda tabla. Aquellos registros que en ese tabla tengan la clave de la segunda tabla como NULL, es que no se encuentran en la primera.

Similar, pero con una RIGHT JOIN, te dará los otros.

ElDioni 22-04-2013 18:20:02

Hola,

sería algo así:

Código SQL [-]
SELECT DISTINCTROW Tabla1.Codigo
FROM Tabla1 LEFT JOIN Tabla2 ON Tabla1.codigo = Tabla2.codigo
WHERE (((Tabla2.codigo) Is Null));

Saludos.

darkamerico 22-04-2013 18:41:36

Saludos
 
Amigos, me place deciros que me salio de la siguiente forma:

Código SQL [-]
select rc from fise_usuarioxsumin where not exists (select 1 from fise_transicion where fise_transicion.rc=fise_usuarioxsumin.rc 
and fise_transicion.anio='2013' and fise_transicion.mes='01') and fise_usuarioxsumin.anio='2013' and fise_usuarioxsumin.mes='03'

Bendito SQL!!

jeje

Saludos

Neftali [Germán.Estévez] 22-04-2013 20:39:30

Ahora que ya lo tienes así y que te funciona, yo probaría con JOIN, ya que son mucho más eficientes que esta otra manera.
A malas ya lo tienes así...

cloayza 29-04-2013 17:34:29

Cita:

Empezado por darkamerico (Mensaje 459032)
..No soy muy bueno en SQL...

:confused:

Si me permites te aconsejaría que dediques un tiempo a estudiar y documentarte sobre el Lenguaje SQL.

Así lograrás tener autonomía y podrás enfrentar futuros dudas de la mejor manera...

Saludos cordiales

ozsWizzard 29-04-2013 18:55:55

1 Archivos Adjunto(s)
Cita:

Empezado por Neftali (Mensaje 459052)
Ahora que ya lo tienes así y que te funciona, yo probaría con JOIN, ya que son mucho más eficientes que esta otra manera.
A malas ya lo tienes así...

Yo no tengo eso tan claro. Me ha asaltado la duda a leer tan severa afirmación y he encontrado esto

http://explainextended.com/2009/09/1...ll-sql-server/

Viene a decir, para Sql Server, todo lo contrario. Mi inglés no es muy bueno pero es la conclusión que saco de That’s why the LEFT JOIN / IS NULL query takes 810 ms, or 3 times as much as the NOT EXISTS / NOT IN query.

De todas formas, tengo aquí Sql Server, lo he probado y parece que el enlace que he puesto tiene razón.

En la imagen que subo se puede ver arriba el resultado el "NOT EXISTS" y abajo el "LEFT JOIN"

Saludos


La franja horaria es GMT +2. Ahora son las 06:40:30.

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