Sql server SQL-记录不在另一个表中

Sql server SQL-记录不在另一个表中,sql-server,tsql,Sql Server,Tsql,在做我认为是一项相当常规的任务,即在一个表中查找另一个表中不存在的记录时,我从下面开始。注意:公共值在一个表中为float类型(因此为cast),在另一个表中为varchar(20)。MEMID=float,DMID=varchar select cast((convert(int, MEMID)) as varchar(20)) from tempProv111315 where cast((convert(int, MEMID)) as varchar(20)) NOT IN (

在做我认为是一项相当常规的任务,即在一个表中查找另一个表中不存在的记录时,我从下面开始。注意:公共值在一个表中为float类型(因此为cast),在另一个表中为varchar(20)。MEMID=float,DMID=varchar

select cast((convert(int, MEMID)) as varchar(20))
from tempProv111315
where cast((convert(int, MEMID)) as varchar(20)) NOT IN (
     SELECT DMID
     FROM tempMemberMaster121015
)
上面没有返回任何记录(尽管我知道有一些记录)。因此,我尝试了以下方法(有效)

虽然可能是一个简单的原因,但就我的一生而言,我不明白为什么第一种方法不起作用。我不是dba,但在不同的情况下经常使用这两种方法,所以我真的想了解我遗漏了什么。谁能解释一下不同的结果,因为它们在逻辑上似乎与我相同

ps-我熟悉几种投掷浮标的方法。这是我典型的方法。我不相信这是个问题。。。但是如果是这样的话,为什么在第二个语句中它可以正常工作呢


谢谢

这是一个已知的行为,您的子查询将返回
NULL
,这使得
不在
中失败。可以找到更多信息

我建议您使用
不存在
而不是
左外部联接

您可以使用SQL Server中的查询从一个查询的结果返回不在第二个查询结果中的不同行

语法是:

{ <query_specification> | ( <query_expression> ) } 
EXCEPT 
{ <query_specification> | ( <query_expression> ) }

注意:对于其他数据库系统:在Oracle中,关键字为而不是Exception。在MySQL中没有EXCEPT操作符,我相信PostgreSQL也没有。然而,Gokhan Atil有一篇文章描述了这一点,顺便说一句,这与您在问题中发现的左外部连接查询是相同的

可能有用的阅读:正确,返回中只有一个null。结合上面评论中提供的“有用的阅读资料”,我现在明白了。您建议使用“不存在”是适当的,我打算这样做。谢谢你的时间。非常好!我刚试过这个,效果很好。MM93完全回答了这个问题,但这可能是我的方式,除非我发现了缺点。谢谢你的建议。
NOT IN
(
     SELECT DMID -- check whether this returns any NULL value
     FROM tempMemberMaster121015
)
{ <query_specification> | ( <query_expression> ) } 
EXCEPT 
{ <query_specification> | ( <query_expression> ) }
SELECT CAST((CONVERT(INT, MEMID)) AS VARCHAR(20)) from tempProv111315  
EXCEPT
SELECT DMID FROM tempMemberMaster121015