这个应该是空值的问题吧?
楼主试试这个好象是对的哦!select * from A a left join B b on a.A=b.C where isnull(b.C,'')<>'c'

解决方案 »

  1.   

    刚刚测试了一下,确定绝对是sql对于null处理标准的问题,我记得有个SET ……具体是什么不记得了。
    不信楼主可以测试一下
    select 1 from sysobjects where NULL='C'select 1 from sysobjects where NULL<>'C'都查不出记录
      

  2.   

    算法并不重要,主要是Null 你想想 null只能用 is 或者 is not 这种= 、<> 、<....当然不成立了
    所以null值不参与计算
      

  3.   

    注释
    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的行。说明  Microsoft&reg; SQL Server&#8482; 是将空字符串解释为单个空格还是真正的空字符串,取决于 sp_dbcmptlevel 的兼容级别设置。如果兼容级别小于或等于 65,SQL Server 就将空字符串解释为单个空格。如果兼容级别等于 70,则 SQL Server 将空字符串解释为空字符串。有关更多信息,请参见 sp_dbcmptlevel。
    当 SET ANSI_NULLS 为 ON 时,所有对空值的比较均取值为 UNKNOWN。当 SET ANSI_NULLS 为 OFF 时,如果数据值是 NULL,则所有数据对空值的比较将取值为 TRUE。如果未指定,则应用当前数据库的 ANSI nulls 选项的设置。有关 ANSI nulls 数据库选项的更多信息,请参见 sp_dboption 和设置数据库选项。为使脚本按预期运行,不管 ANSI nulls 数据库选项或 SET ANSI_NULLS 的设置是什么,在可能包含空值的比较中使用 IS NULL 和 IS NOT NULL。对于存储过程,SQL Server 使用最初创建存储过程时的 SET ANSI_NULLS 设置值。无论随后何时执行存储过程,SET ANSI_NULLS 的设置都还原为其最初使用的值并生效。当在存储过程内唤醒调用 SET ANSI_NULLS 时,其设置不更改。在执行分布式查询时应将 SET ANSI_NULLS 设置为 ON。在计算列或索引视图上创建或操作索引时,SET ANSI_NULLS 也必须为 ON。如果 SET ANSI_NULLS 为 OFF,计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。SQL Server 将返回一个错误,列出所有违反所需值的 SET 选项。另外,在执行 SELECT 语句时,如果 SET ANSI_NULLS 为 OFF,则 SQL Server 将忽略计算列或视图上的索引值并解析选择,就好象表或视图上没有这样的索引一样。说明  ANSI_NULLS 是在处理计算列或索引视图上的索引时必须设置为所需值的七个 SET 选项之一。还必须将选项 ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER 和 CONCAT_NULL_YIELDS_NULL 设置为 ON,而必须将 NUMERIC_ROUNDABORT 设置为 OFF。
    SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_NULLS 设置为 ON。该设置可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性(它们在连接到 SQL Server 之前在应用程序中设置)中进行配置。对来自 DB-Library 应用程序的连接,SET ANSI_NULLS 默认为 OFF。当 SET ANSI_DEFAULTS 为 ON 时,将启用 SET ANSI_NULLS。SET ANSI_NULLS 的设置是在执行或运行时设置,而不是在分析时设置。
      

  4.   

    刚刚查的帮助。
    其实楼主的问题主要是空值问题楼主可以去查查sql联机帮助
    应该会有点用处
      

  5.   

    tangqijun199(撒旦.搏一搏,3角变4角.冲刺5角中……) 说得没错。这种形式的SQL语句,一定是先执行Left Join联接操作,再执行where后面的条件进行过滤操作。也就是说都是在第一条语句的执行结果之上再进行过滤操作。第2条语句之过滤掉了 a.A = 'c'的那条记录。第3条语句因为b.C包含了 为null和不为null两种记录,只要对 b.c设置条件都会将为null的记录过滤掉。对可能为null的字段设置条件时应该进行特殊处理,如果不想过滤掉null的话应该把第3条语句的条件改为 isnull(b.C, '') = 'C',这样第3条语句得到的执行结果就和第2条语句的结果一样了另外,楼主可以把 where 改为 and 这样就会先进行过滤再进行联接。又是一种结果了。
      

  6.   

    select * from A a left loop join  B b on a.A=b.C where b.C<>'c' or b.c is null警告: 由于使用了局部联接提示,所以联接次序得以强制实施。
    a    b    c    d    
    ---- ---- ---- ---- 
    a    1    a    6
    b    2    b    7
    d    4    NULL NULL
    e    5    NULL NULL(所影响的行数为 4 行)怎么会有个警告
      

  7.   

    呵呵写错了那个loop 忘记去掉了
    这样就对了
    select * from A a left join  B b on a.A=b.C and ( b.C<>'c' and b.c is null)
      

  8.   

    null是一个很特殊的东西,不能用=,<>;
    因此,在比较列的时候,是先把null排除在计算的不光是这样,count的时候也是同样
    count(*)得到的结果是包含值为null的行的
    count(coll)得到的结果是先把值为null的行去掉在计算的