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 条件的主要内容,如果未能解决你的问题,请参考以下文章
C# 中的日期时间与 SQL Server 中的 SQL 和 GETDATE()
标准 sql 中的 bigquery 旧版 sql POSITION() 函数
Oracle:使用 SQL 或 PL/SQL 查找动态 SQL 中的错误位置
sql (SSMS) 中的 CONVERT 函数是不是可以替换为 Pyspark.sql 中的类似函数。换句话说,有没有类似的功能?