PDA

Ver la Versión Completa : Listar registros de una Tabla que NO estan en Otra...


darkamerico
22-04-2013, 17:45:39
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:

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:

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:

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í:


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
Amigos, me place deciros que me salio de la siguiente forma:

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
..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
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/15/not-in-vs-not-exists-vs-left-join-is-null-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