SQL 中的 NOT IN 条件

Posted

技术标签:

【中文标题】SQL 中的 NOT IN 条件【英文标题】:NOT IN condition in SQL 【发布时间】:2010-11-16 18:16:47 【问题描述】:

谁能告诉我两列 SQL 中 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);"

但这不起作用.....

【问题讨论】:

你需要什么,列组合在一起不起作用或数据不在任一列中? 两列是什么意思? HLGEM,两列的组合.. 了解您使用的 MS-Access 版本会有所帮助,因为这可能会影响答案。 我想不出任何版本的 Access 中的这种简单 SQL 的单一版本差异,如果您在 A2003 或稍后并打开 SQL 92 模式,但我什至不认为这会有所作为(除非您使用的是 SQL 92 关键字,但没有一个会突然出现在我身上)。简而言之,我真的不认为 Access 的版本有丝毫不同——这个查询中的所有内容一直都得到支持。 【参考方案1】:

您不能将IN 用于一列以上,但通常可以使用EXISTS 达到相同的效果:

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

【讨论】:

【参考方案2】:

一般语法:

where col not in (items)

物品可以是

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

或者选择语句(select hatefulthings from table)


6 年后添加

例如,所有主要平台都支持带有 NOT IN 的元组

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

在此示例中,我们从员工表中选择所有员工 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 列中的所有记录。

【讨论】:

【参考方案4】:

也许你的意思

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

这在 Oracle 下是允许的 - 不确定 SQL Server。

分享和享受。

【讨论】:

哦,是的,我尝试了相同的语法,但它不起作用..我在访问平台上工作,我应该在 VBA 中编写查询。 我已经重新标记了这个问题,以便 MS Access 专家可以看看这个。 它可能在 Access 中工作,但它不会使用索引,所以它可能非常非常慢。【参考方案5】:
Select * from some_table
where (((Some_Value) Not IN (Select Column1 & Column2 from Some_Other_Table)));

我看到你指出这是用于 Access 的地方

【讨论】:

检查我的查询一次.. 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 从包装器中移除') AND tblEventLog.TrackingNumber = """ & tempTrackingNumber & """ AND tblRevRelLog_Detail .RevRelTrackingNumber;" 它不可能工作,因为子查询返回两列。在 IN 子查询中只能使用单列 SELECT。 Column1 & Column2 算作一列,但我认为如果两列都是数字,这可能是一种机会。 两列的连接值不一定与相同列上的连接相同。如果 Column1 和 Column2 中的值可以重叠怎么办?比如说,这是一对名字/姓氏字段。 Smith 可以是名字或姓氏,如果一个字段为 Null,Smith & Null 的结果将与 Null & Smith 相同,并且会匹配,但不会是适当的匹配。除此之外,鉴于此解决方案不能使用索引,对我来说似乎完全不是初学者。【参考方案6】:

不清楚您在问什么,但我推测您希望基于两列而不是仅一列的 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 ...)将其转换为相等的文本,然后相应地匹配它。

【讨论】:

以上是关于SQL 中的 NOT IN 条件的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server如何防止动态sql中的sql注入

C# 中的日期时间与 SQL Server 中的 SQL 和 GETDATE()

sql注入Mybatis中的#{参数}和${参数}

标准 sql 中的 bigquery 旧版 sql POSITION() 函数

Oracle:使用 SQL 或 PL/SQL 查找动态 SQL 中的错误位置

sql (SSMS) 中的 CONVERT 函数是不是可以替换为 Pyspark.sql 中的类似函数。换句话说,有没有类似的功能?