您的位置:首页 > 数据库 > SQL语言 > 正文

SQL中not in有Null值时

更多 时间:2016-6-20 类别:数据库 浏览量:1668

SQL中not in有Null值时

SQL中not in有Null值时

一、实例数据

 

Table_A表和Table_B表

 

  •  
  • SQL 代码   复制
  • 
    CREATE TABLE [dbo].[Table_A](
     [ID] [nchar](10) NULL,
     [Name] [nchar](10) NULL
    ) ON [PRIMARY]
    
    GO
    
    ID         Name
    001        张三        
    002        李四        
    003        王五              
    
     
    
    CREATE TABLE [dbo].[Table_B](
     [ID] [nchar](10) NULL,
     [Name] [nchar](10) NULL
    ) ON [PRIMARY]
    
    GO
    
    ID       Name
    NULL     张三        
    002      李四        
    NULL     王五 
    
    		
  •  

    二、查询出在Table_A表中不在Table_B表中的记录

     

    1、错误SQL写法 (没有任何结果返回)

     

  •  
  • SQL 代码   复制
  • 
    SELECT  *
    FROM    dbo.Table_A AS a
    WHERE   a.ID NOT IN ( SELECT    b.ID
                          FROM      dbo.Table_B AS b)
    
    		
  •  

    2、错误原因

    (1)、如果null参与算术运算,则该算术表达式的值为null。(例如:+,-,*,/ 加减乘除)

    (2)、如果null参与比较运算,则结果可视为false。(例如:>=,<=,<>  大于,小于,不等于)

    (3)、如果null参与聚集运算,则聚集函数都置为null。除count(*)之外。

    (4)、如果在not in子查询中有null值的时候,则不会返回数据。

    例如

     

  •  
  • SQL 代码   复制
  • 
    SELECT *
    FROM dbo.TableA AS a
    WHERE a.id NOT IN ( 2, NULL )
    
    
    --等同于:
    
    SELECT *
    FROM Table_A AS a
    WHERE a.id <> 2
     AND a.ID <> NULL
    
    --由于NULL值不能参与比较运算符,导致条件不成立,查询不出来数据。
    
    		
  •  

    3、正确SQL写法

     

  •  
  • SQL 代码   复制
  • 
    --写法1                      
    SELECT  *
    FROM    dbo.Table_A AS a
    WHERE   a.ID NOT IN ( SELECT    b.ID
                          FROM      dbo.Table_B AS b
                          WHERE     b.ID IS NOT NULL ) --排除NULL值参与运算符比较
    
    
    --写法2                                                        
    SELECT  *
    FROM    dbo.Table_A AS a
    WHERE   NOT EXISTS ( SELECT *
                         FROM   dbo.Table_B AS b
                         WHERE  a.ID = b.ID )
    
    				
  •  

    标签:SQL
    您可能感兴趣