2008-12-03 23 views

Respuesta

27

INTERSECT es una unión interna. MINUS es una combinación externa, donde elige solo los registros que no existen en la otra tabla.


se cruzan

select distinct 
    a.* 
from 
    a 
    inner join b on a.id = b.id 

MENOS

select distinct 
    a.* 
from 
    a 
    left outer join b on a.id = b.id 
where 
    b.id is null 

Si edita su pregunta original y publicar algunos datos de la muestra a continuación un ejemplo se puede dar.

EDITAR: Se olvidó de agregar en el distinto a las consultas.

+0

Hermosa respuesta :) –

+0

¿Por qué? La lógica produce los mismos resultados que el estándar SQL INTERSECT y MINUS. – LeppyR64

+0

Esto es exactamente lo que estaba diciendo y me votaron en contra. Ah bueno. +1 para usted, ya que se tomó el tiempo para dar ejemplos de sintaxis. –

3

Se realizan a través de JOIN. La forma antigua :)

Para INTERSECT, puede utilizar una UNIÓN INTERNA. Muy claro. Solo necesita usar GROUP BY o DISTINCT si no tiene una relación pura de persona a persona. De lo contrario, como otros mencionaron, puedes obtener más resultados de los que esperarías.

Por MENOS, puede usar una UNIÓN IZQUIERDA y usar el LUGAR DONDE limitarla, por lo que solo recibirá las filas de la tabla principal que no coinciden con la tabla JUNTO A LA IZQUIERDA.

Easy peasy.

+0

Me votaron también, pero su respuesta es correcta. – LeppyR64

0

Desafortunadamente, MINUS no es compatible con MS Access; una solución alternativa sería crear tres consultas, una con el conjunto de datos completo, una que extraiga las filas que desea filtrar y una tercera que deja las dos tablas y solo extrae registros que solo existen en su conjunto de datos completo.

Lo mismo vale para INTERSECT, excepto que lo haría a través de una unión interna y solo devolvería los registros que existen en ambos.

+0

Su implementación MINUS es demasiado complicada. -1 – LeppyR64

+0

No es Access lo que no lo admite. Si escribe un paso directo al servidor SQL usando MINUS o INTERSECT, funcionará perfectamente. Es el motor de base de datos Jet cuyo dialecto SQL no incluye estos dos operadores. Todos los dialectos SQL están incompletos, así que este no es un gran problema con Jet. –

12

INTERSECT NO ES UNA UNIÓN INTERNA. Ellos son diferentes. Un INNER JOIN le dará filas duplicadas en casos donde INTERSECT NO lo hará. Puede obtener resultados equivalentes por:

SELECT DISTINCT a.* 
FROM a 
INNER JOIN b 
    on a.PK = b.PK 

Tenga en cuenta que PK debe ser la columna o columnas de la clave principal. Si no hay PK sobre la mesa (Malo), debe escribirlo así:

SELECT DISTINCT a.* 
FROM a 
INNER JOIN b 
    ON a.Col1 = b.Col1 
    AND a.Col2 = b.Col2 
    AND a.Col3 = b.Col3 ... 

Con MENOS, puede hacer lo mismo, pero con un LEFT JOIN, y una condición en la comprobación de nula en una de las columnas que no admiten nulos de la tabla b (preferiblemente la clave principal).

SELECT DISTINCT a.* 
FROM a 
LEFT JOIN b 
    on a.PK = b.PK 
WHERE b.PK IS NULL 

Eso debería hacerlo.

+0

Saludos, se me olvidó agregar lo distinto en mi publicación. +1. – LeppyR64