日期:2014-05-18  浏览次数:20656 次

关于一个查询语句
困惑我很久了,
有2个数据库服务器:SqlA.DataA,SqlB.DataB
有2个表:DataA.TableA,DataB.TableB
2个表中都有这样字段:DataA.TableA.ItemA,DataB.TableB.ItemB

当使用select   *   from   TableA   where   ItemA   not   in   (select   ItemB   from   SqlB.DataB.TableB)
查询结果却很失败,肉眼能看到很多纪录是存在于TableA   却不存在于TableB表中,但是查询结果是空!

------解决方案--------------------
以前我也碰到过这样的问题,看看你的select ItemB from SqlB.DataB.TableB
是不是有 null 值,in 相当于等号,null 不是0不是空 不能与其它值比较,所以即使有符合条件的记录也不会出来。
可用在执行前加上set ansi_nulls off 记得结束后 用set ansi_nulls on 恢复,免得影响其它,或者 用 isnull 转化一下,select * from TableA where ItemA
not in (select isnull(ItemB, ' ') from SqlB.DataB.TableB)

------解决方案--------------------
若要确定表达式是否为 NULL,请使用 IS NULL 或 IS NOT NULL,而不要用比较运算符(例如 = 或 !=)。如果有一个参数为 NULL 或两个参数都为 NULL,那么比较运算符返回 UNKNOWN。
in 相当于 =

SQL-92 标准要求对空值的等于 (=) 或不等于 ( <> ) 比较取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍返回零行。

当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 ( <> ) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中含有空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中含有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有非 XYZ 值和非 NULL的行。

------解决方案--------------------
support