2010-11-16 184 views
7

任何人都可以告诉我在两列的SQL中NOT IN条件的确切语法。NOT 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;" 

我想改变这个子查询等,但是应当在两列的组合应用如下:

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

但这不是工作.....

+0

你需要什么,列的组合不起作用或者数据不在任何一列中? – HLGEM 2010-11-16 18:18:18

+0

你是什么意思的两列? – Hogan 2010-11-16 18:18:21

+0

HLGEM,两列组合.. – user397316 2010-11-16 18:20:52

回答

17

不能使用IN一个以上的列,但你通常可以达到使用EXISTS同样的效果:

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

一般语法:

where col not in (items) 

项目可以是

  • 项目列表 - (4,5,3,5,2)('243','3','cdds')或任何其他数据类型。

  • 或者select语句(select hatefulthings from table)


加入6-年后

与不能在所有主流平台支持的元组,例如

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

在这例如我们选择everyth从员工表中的员工ID和日期的元组不在包含休假日的表中。

3

你的问题有点不清楚。这是你需要的吗?

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

这将显示搜索短语(“Smith”)既不在first_name也不在last_name列中的所有记录。

1

也许你的意思是

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

这是甲骨文下允许 - 不知道有关SQL Server。

分享和享受。

+0

哦,你好,我尝试了相同的语法,但它没有工作......我正在访问平台上工作,我应该在VBA中写入查询。 – user397316 2010-11-16 18:33:01

+0

为什么标签说sql如果您正在访问? – Hogan 2010-11-16 19:03:48

+0

我已经重申了这个问题,以便MS Access专家可以看看这个问题。 – 2010-11-16 19:25:55

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

我看到,你表示这是为访问

+0

结帐我的查询一次.. 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)不在(SELECT tblEventLog.PartNumber,tblEventLog.PartNumberChgLvl FROM tblEventLog WHERE tblEventLog.EventTypeSelected ='pn REMOVED From Wrapper')AND tblEventLog.TrackingNumber =“”“&tempTrackingNumber&”“”AND tblEventLog.TrackingNumber = tblRevRelLog_Detail.RevRelTrackingNumber;“ – user397316 2010-11-16 19:10:24

+0

我试过这种方式,它没有工作.. – user397316 2010-11-16 19:12:49

+0

我没有工作,你能更模糊吗? – JeffO 2010-11-17 14:09:57

0

目前还不清楚你问什么,但据我了解,你想有一个NOT IN条件基于两列,而不只是一个。例如,假设您有一个名为F_Name的列和另一个名为L_Name(两个变量的大小都相同)的列,并且您希望从另一个表中将这些名称的特定组合排除在外,这些名称已经以NAME组合在一起。在这种情况下,你可以这样做:

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 ... 
    ) 

该查询的主要问题是,你必须获得格式化恰到好处,让他们能够完全匹配起来。

如果您正在处理不同类型字段的组合(如数字和时间戳),则可以使用任何转换命令(DECIMAL,INTEGER,CHAR,SUBSTR ...)来转换为等于然后相应地匹配它。

+0

更新了我的查询,请查看我的问题... – user397316 2010-11-16 19:30:32