Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NOT IN condition in SQL

Tags:

sql

ms-access

Can anyone tell me the exact syntax for NOT IN condition in SQL on two columns.

This is my query written in 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;"

I want to change this sub query like, it should apply on the combination of two columns as follows:

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);"

But this is not working.....

like image 965
user397316 Avatar asked Nov 16 '10 18:11

user397316


2 Answers

You can't use IN with more than one column but you can usually achieve the same effect using EXISTS:

SELECT *
FROM tbl1
WHERE NOT EXISTS
(
    SELECT *
    FROM tbl2
    WHERE tbl2.col1 = tbl1.col1
        AND tbl2.col2 = tbl1.col2
)
like image 68
Daniel Renshaw Avatar answered Oct 08 '22 08:10

Daniel Renshaw


General syntax:

where col not in (items)

Items can be

  • a list of items -- (4,5,3,5,2) or ('243','3','cdds') or any other datatype.

  • Or a select statement (select hatefulthings from table)


Addition 6 years later

All major platforms support tuples with NOT IN, for example

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

In this example we select everything from the employee table where the tuple of employee id and date are not in a table containing vacation days.

like image 35
Hogan Avatar answered Oct 08 '22 08:10

Hogan