2010-11-16 21 views
7

¿Alguien me puede decir la sintaxis exacta para la condición NOT IN en SQL en dos columnas.NO EN CONDICIÓN en SQL

Esta es mi consulta escrita en VBA.

strNewSql = "SELECT distinct(tblRevRelLog_Detail.PartNumber), tblRevRelLog_Detail.ChangeLevel, tblRevRelLog_Detail.ID FROM tblRevRelLog_Detail LEFT JOIN tblEventLog ON tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber" 

strNewSql = strNewSql & " WHERE (tblEventLog.PartNumber) Not In(SELECT tblEventLog.PartNumber FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper') AND tblEventLog.TrackingNumber = """ & tempTrackingNumber & """ AND tblEventLog.TrackingNumber = tblRevRelLog_Detail.RevRelTrackingNumber;" 

que quieren cambiar esta consulta sub similares, se debe aplicar en la combinación de dos columnas de la siguiente manera:

strNewSql = "SELECT tblRevRelLog_Detail.PartNumber, tblRevRelLog_Detail.ChangeLevel, tblRevRelLog_Detail.ID FROM tblRevRelLog_Detail LEFT JOIN tblEventLog ON tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber" 

strNewSql = strNewSql & " WHERE (((tblEventLog.PartNumber, tblEventLog.PartNumberChgLvl) Not In(SELECT tblEventLog.PartNumber,tblEventLog.PartNumberChgLvl FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED From Wrapper') AND tblEventLog.TrackingNumber = """ & tempTrackingNumber & """ AND tblEventLog.TrackingNumber = tblRevRelLog_Detail.RevRelTrackingNumber);" 

Pero esto no está funcionando .....

+0

¿Qué necesita, la combinación de las columnas juntas no funciona o los datos no están en ninguna columna? – HLGEM

+0

¿Qué quiere decir con dos columnas? – Hogan

+0

HLGEM, combinación de dos columnas .. – user397316

Respuesta

17

No se puede utilizar IN con más de una columna, pero por lo general puede conseguir el mismo efecto usando EXISTS:

SELECT * 
FROM tbl1 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM tbl2 
    WHERE tbl2.col1 = tbl1.col1 
     AND tbl2.col2 = tbl1.col2 
) 
3

general sintaxis:

where col not in (items) 

Los productos que pueden ser

  • una lista de elementos - (4,5,3,5,2) o ('243','3','cdds') o cualquier otro tipo de datos.

  • O una instrucción de selección (select hatefulthings from table)


Adición 6 años después

Todos los principales tuplas de apoyo plataformas con NO, por ejemplo

SELECT * 
FROM empoyee 
WHERE (empID, @date) NOT IN 
    (SELECT empID, vacationDay 
    FROM empVacation 
) 

En este ejemplo, seleccionamos todo de la tabla de empleados donde la tupla de identificación y fecha de empleado no se encuentra en una tabla que contiene días de vacaciones.

3

Su pregunta es un poco confuso. ¿Esto es lo que necesitas?

SELECT * 
FROM 
    MY_TABLE MT 
WHERE 'Smith' NOT IN (MT.FIRST_NAME) 
    AND 'Smith' NOT IN (MT.LAST_NAME) 

Esto le mostrará todos los registros donde la frase de búsqueda ("Smith") no está ni en el nombre apellido ni la columna last_name.

1

Tal vez significaba

SELECT * 
    FROM MY_TABLE 
    WHERE (FIRST_NAME, LAST_NAME) NOT IN (SELECT FIRST_NAME, LAST_NAME 
              FROM SOME_OTHER_TABLE) 

Esto es posible según Oracle - no está seguro acerca de SQL Server.

Compartir y disfrutar.

+0

Ohh, ya probé la misma sintaxis, pero no funcionó ... bueno, estoy trabajando en la plataforma de acceso y debería escribir una consulta en el VBA. – user397316

+0

¿por qué las etiquetas dicen sql si está trabajando en el acceso? – Hogan

+0

He reparado la pregunta para que tal vez los expertos en MS Access puedan ver esto. –

0
Select * from some_table 
where (((Some_Value) Not IN (Select Column1 & Column2 from Some_Other_Table))); 

vi en el que indicó que esto era para el Acceso

+0

la salida de mi consulta una vez .. strNewSql = "SELECT tblRevRelLog_Detail.PartNumber, tblRevRelLog_Detail.ChangeLevel, tblRevRelLog_Detail.ID DE tblRevRelLog_Detail LEFT JOIN tblEventLog EN tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber" strNewSql = strNewSql y "DONDE (tblEventLog.PartNumber) No En (SELECCIONA tblEventLog.PartNumber, tblEventLog.PartNumberChgLvl FROM tblEventLog WHERE tblEventLog.EventTypeSelected = 'pn REMOVED FROM Wrapper') Y tblEventLog.TrackingNumber = "" "& tempTrackingNumber &" "" Y tblEventLog.TrackingNumber = tblRevRelLog_Detail.RevRelTrackingNumber; " – user397316

+0

Lo intenté de esta manera, no funcionó ... – user397316

+0

No funcioné, ¿podría ser más vago? – JeffO

0

No está claro lo que están pidiendo, pero tengo entendido que le gustaría tener un no en condiciones en base a dos columnas en lugar de uno solo .

Como ejemplo, supongamos que tiene una columna llamada F_Name y otra llamada L_Name (ambas variables en tamaño), y que quiere excluir una combinación específica de esos nombres de otra tabla que ya los tiene combinados como NAME.En ese caso, se puede hacer esto:

select F_name 
    , L_name 
    , col1 
    , coln 
    from mytable1 
where F_name     -- First name (variable length) 
    || ' '      -- appended to a blank space 
    || L_name     -- appended to the last name (v) 
     not in     -- is not one of these names 
    (select name 
     from mytable2 
     where ... 
    ) 

El principal problema con esta consulta es que se debe colocar el formato justo para que puedan coincidir exactamente.

Si se trata de una combinación de campos con diferentes tipos, como numéricos y de fecha y hora, utilice cualquiera de los comandos de conversión (DECIMAL, INTEGER, CHAR, SUBSTR ...) a su disposición para convertir a texto igual y luego haga coincidir en consecuencia.

+0

actualicé mi consulta, por favor revisa mi pregunta ... – user397316