当前位置:Gxlcms > 数据库问题 > SQL 中 NOT IN 查询不到数据

SQL 中 NOT IN 查询不到数据

时间:2021-07-01 10:21:17 帮助过:10人阅读

a.ID , a.Sub_Project_Name , a.Sub_Project_Type FROM TB_KYSubProject a WHERE a.ID NOT IN ( SELECT DISTINCT c.SubprojectID FROM TB_KYGrogramme c WHERE ISNULL(c.Belong_Programme, ‘‘) <> ‘‘ AND c.Belong_Programme IN ( SELECT ConfigValue FROM PB_Config WHERE ConfigKey = 子项目共有所属方案 ) )

技术分享图片

 

但是查询TB_KYGrogramme和TB_KYSubProject都有数据,TB_KYSubProject比TB_KYGrogramme的数据还多,不应该没数据

TB_KYGrogramme

SELECT DISTINCT c.SubprojectID 
        FROM    TB_KYGrogramme c
        WHERE   ISNULL(c.Belong_Programme, ‘‘) <> ‘‘
                AND c.Belong_Programme IN ( SELECT  ConfigValue
                                            FROM    PB_Config
                                            WHERE   ConfigKey = 子项目共有所属方案 )

技术分享图片

 

TB_KYSubProject

SELECT DISTINCT a.ID 
FROM    TB_KYSubProject a

技术分享图片

 

后面筛选TB_KYGrogramme,有一条数据SubprojectID是NULL

SELECT DISTINCT c.SubprojectID 
        FROM    TB_KYGrogramme c
        WHERE   ISNULL(c.Belong_Programme, ‘‘) <> ‘‘
                AND c.Belong_Programme IN ( SELECT  c.ConfigValue
                                            FROM    PB_Config c
                                            WHERE   c.ConfigKey = 子项目共有所属方案 )
                                            AND c.SubprojectID  IS NULL

技术分享图片

 

二、原因

SELECT  1 AS id ,
        1 AS subprojectid
UNION
SELECT  2 AS id ,
        2 AS subprojectid
UNION
SELECT  3 AS id ,
        3 AS subprojectid
UNION
SELECT  4 AS id ,
        NULL AS subprojectid

 

SELECT  *
FROM    ( SELECT    1 AS id ,
                    1 AS subprojectid
          UNION
          SELECT    2 AS id ,
                    2 AS subprojectid
          UNION
          SELECT    3 AS id ,
                    3 AS subprojectid
          UNION
          SELECT    4 AS id ,
                    NULL AS subprojectid
        ) vv
WHERE   subprojectid NOT IN ( 1, NULL )

等同

SELECT  *
FROM    ( SELECT    1 AS id ,
                    1 AS subprojectid
          UNION
          SELECT    2 AS id ,
                    2 AS subprojectid
          UNION
          SELECT    3 AS id ,
                    3 AS subprojectid
          UNION
          SELECT    4 AS id ,
                    NULL AS subprojectid
        ) vv
WHERE   subprojectid <> 1
        AND subprojectid <> NULL 

NULL值不能参与比较运算符,要筛选非NULL数据,要用 is not null,而不能用<>NULL,具体看下数据库中的三值逻辑(Tree-Value-Logic)。

所以子查询有结果是NULL,那查询条件为空

 

三、方法

 知道问题原因,对sql语句修改,把SubprojectID是NULL的数据排查

SELECT  a.ID ,
        a.Sub_Project_Name ,
        a.Sub_Project_Type
FROM    TB_KYSubProject a
WHERE   a.ID NOT IN (
        SELECT DISTINCT c.SubprojectID 
        FROM    TB_KYGrogramme c
        WHERE   ISNULL(c.Belong_Programme, ‘‘) <> ‘‘
                AND c.Belong_Programme IN ( SELECT  ConfigValue
                                            FROM    PB_Config
                                            WHERE   ConfigKey = 子项目共有所属方案 )  AND c.SubprojectID IS NOT NULL)

技术分享图片

 

开发中遇到该问题记录下

SQL 中 NOT IN 查询不到数据

标签:比较   csdn   条件   sub   .net   排查   运算符   where   rom   

人气教程排行