SQL - Encontrar registros diferentes entre dos Tablas

Espero me puedan ayudar con los siguiente:

Tengo dos tablas (test1, test2) con los campos "Factura" y "Monto" en cada una, necesito crear una consulta que me devuelva únicamente los registros que se encuentren en Test1 pero que no estén en Test2. Hasta el momento he creado esta consulta:

SELECT Factura, Monto 
FROM Test1 
WHERE Factura NOT IN (SELECT Factura from Test2) 
AND Monto NOT IN (SELECT Monto from Test2)

Me funciona de maravilla, pero puede ser que en Test1 existan registros duplicados, entonces, al ejecutar esta consulta no me devuelva dichos duplicado que no estén en Test2.

Por ejemplo:

Esta consulta solamente me devolvería la factura 1005 por $7.50, pero necesito que también considere los duplicados y me devuelva las facturas 1003 y 1005.

2 Respuestas

Respuesta
2

Fíjate que lo que pides (con esos datos) no tiene mucho sentido:

¿Cómo quieres que la consulta sepa que el registro 3 (Fact 1003 de 6.6) de Test 1 es diferente del registro 4 (Fact 3 de 6.6), y a su vez, solo uno de ellos sea igual que el registro 3 de Test 2 (Fact 3 de 6.6)?

Es literalmente imposible. Te haría falta tener otro campo en ambas tablas que fuese distinto para cada factura.

Además la SQL que has construido tiene un defecto que imagino no has considerado: si dos facturas distintas tienen el mismo importe y ese importe ya está en Test2, no te aparecerá ninguna.

Por ejemplo, si en Test1 el importe de la factura 1005 es 35.14, esa consulta no te devolverá registros.

Sin embargo, si la construyes así:

SELECT Test1.Factura, Test1.Monto
FROM Test1
WHERE Factura & Monto Not In (SELECT Factura & Monto from Test2);

sí te devolverá la factura 1005 de importe 35.14

Releyendo tu pregunta, añado que en mi respuesta anterior interpreté que el resultado que querías era éste:

1003       6.6

1005       7.5

Y por eso mi comentario de la imposibilidad de lograrlo (al menos hasta donde llegan mis conocimientos)

Sin embargo, si el que esperas obtener es este otro:

1003       6.6

1003       6.6

1005       7.5

Es decir, que te salgan las dos facturas repetidas aunque estén en Test2, la SQL que neesitas es ésta:

SELECT Test1.Factura, Test1.Monto
FROM Test1
WHERE ((([Factura] & [Monto]) Not In (SELECT Factura & Monto from Test2))) OR (((DCount("*","[Test1]","Factura=" & [Factura]))>1));

Saludos!


Visítanos: http://nksvaccessolutions.com/ 

¡Gracias! creo que la respuesta es acertada, lamentablemente no tengo otro campo que me pueda diferenciar los duplicados. Voy a abrir una nueva pregunta ojala me pueda ayudar, siempre relacionado con este tema.

Respuesta
2

Te conviene hacer una diferencia:

select * from test1

except

select * from test2

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas