2010-02-05 9 views
10

Objetivo:¿Cómo uso correctamente "No igual" en MS Access?

La intención de esta consulta es seleccionar todos los valores distintos en una columna que no existen en una columna similar en una tabla diferente.

actual Pregunta:

SELECT DISTINCT Table1.Column1 
FROM Table2, Table1 
WHERE Table1.Column1 <> Table2.Column1 

Resultados de la consulta:

Lo que sucede cuando trato de ejecutar esta consulta es la barra de progreso se llena casi de inmediato, pero luego que prácticamente se congela y se no hace nada más por lo que puedo ver. Cuando uso un signo = en lugar de <> genera los valores que son iguales y si reemplazo Table2.Column1 con un valor real real, funciona bien.

Lo volví a ejecutar mientras escribía esta pregunta y la consulta anterior me dio una respuesta esta vez pero tiene todos los valores DISTINCT para la columna, no todos los valores exclusivos de esa tabla, como debería ser.

¿Alguna idea sobre qué estoy haciendo mal o faltando aquí?

+1

Por cierto, es posible hacer combinaciones no equitativas, aunque debe sumergirse en la ventana SQL ya que no se puede representar en la vista de diseño de Access QBE. Lo que siempre hago es crear un equi-join, luego ir al SQL y cambiar el = en el join a <> o> o < or > = y así sucesivamente. –

Respuesta

17

gusta esta

SELECT DISTINCT Table1.Column1 
FROM Table1 
WHERE NOT EXISTS(SELECT * FROM Table2 
    WHERE Table1.Column1 = Table2.Column1 ) 

NO desea existe, no "es igual a"


Por cierto, que rara vez se quiere escribir una cláusula FROM como esto:

FROM Table1, Table2 

ya que esto significa "DESDE todos combinaciones de cada fila en Table1 wit h cada fila en la Tabla 2 ... "Generalmente son muchas más filas de resultados de las que alguna vez quisieras ver. Y en el raro caso de que usted realmente quiere hacer eso, la sintaxis más aceptada es:

FROM Table1 CROSS JOIN Table2 
+0

Esto funciona gracias. ¿Pero por qué no funciona "NO ES IGUAL" para esto y cómo se supone que debe usarse? – Bryan

+0

Porque "Igualdad" no significa lo que crees que hace. "Igual" es un operador de comparación escalar, pero necesita comparar Conjuntos y sus elementos. EXISTS es uno de los operadores que le permite extender un escalar a un conjunto. – RBarryYoung

+2

CROSS JOIN no es compatible con Jet/ACE SQL. –

2

En Access, es probable que encuentre una combinación es más rápido a menos que las mesas son muy pequeñas:

SELECT DISTINCT Table1.Column1 
FROM Table1 
LEFT JOIN Table2 
ON Table1.Column1 = Table2.Column1 
WHERE Table2.Column1 Is Null 

Esto excluirá de la lista todos los registros con una coincidencia en la Tabla2.

+0

¿Sería capaz de hacer esto con tres tablas fácilmente? Usé dos tablas para entender el punto, pero en realidad estoy haciendo esto con tres tablas. Estoy usando el método de RBarry con dos declaraciones separadas de NOT EXISTS. – Bryan

+0

El camino de Barry es ciertamente bueno, pero no tan bueno para Access, a menos que el tiempo no sea importante. Sí, es bastante fácil con tres tablas. Puede ser necesario crear una consulta secundaria, depende de qué tan complejo sea todo. Puede intentar construir esto en la ventana de diseño de consultas. Puede crear la unión arrastrando campos de una tabla a la siguiente y elegir el tipo de unión haciendo clic con el botón derecho en la línea. De lo contrario, actualice su pregunta para mostrar las tres tablas y la forma en que desea que funcionen juntas. – Fionnuala

+0

En realidad, el camino de Barry en realidad no lleva mucho tiempo, así que me quedaré con lo que NO EXISTE. – Bryan

0

Me ha costado obtener una consulta para devolver los campos de la Tabla 1 que no existen en la Tabla 2 y probé la mayoría de las respuestas anteriores hasta que encontré una forma muy sencilla de obtener los resultados que quería.

Establecí las propiedades de unión entre la tabla 1 y la tabla 2 en la tercera configuración (3) (Todos los campos de la Tabla 1 y solo los registros de la Tabla 2 donde los campos combinados son iguales) y coloqué a Es nulo en los criterios campo de la consulta en la Tabla 2 en el campo que estaba probando. Funciona perfectamente

Gracias a todos sin embargo.

+0

Uhhhh esta pregunta es de hace 4 años ... –