SQL 中 NOT IN 查询不到数据

一、问题

用以下sql语句查询数据,结果为空

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 = ‘子项目共有所属方案‘ ) )

但是查询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)

开发中遇到该问题记录下

原文地址:https://www.cnblogs.com/Zev_Fung/p/8488107.html

时间: 2024-10-11 00:03:42

SQL 中 NOT IN 查询不到数据的相关文章

SQL 中 not in 查询不到数据问题

在开发的过程中,遇到过not in 始终查询不到数据问题 select * from T_CustomerInfo where CustomerID not in (select CustomerID from T_OrderInfo) 后来使用not exists查询 select * from T_CustomerInfo a where not exists (select CustomerID from T_OrderInfo where CustomerID=a.CustomerID)

SQL中一次插入多条数据

SQL中insert一次可以插入一条数据,我们有三种方法可以一次性插入多条数据. 1. 语法:select 字段列表 into 新表 from 源表 注意事项:此种方法新表是系统自动创建,语句执行前不可以存在新表,并且新表只能保留源表的标识列特性,其他约束不能保留. 若只需要源表的数据结构,我们可以在语句中添加(top 0) 2. 语法:insert into 目的表 select 字段列表 from 源表 注意事项:此种方法目的表必须在语句执行前存在,并且每一列要与源表对应. 在此处还有一些有

SQL中的子查询

目录 WHERE子查询 HAVING子查询 FROM子查询 SELECT子查询 EXISIT子查询 查询薪资排名的员工信息(面试) z子查询就是将一个查询(子查询)的结果作为另一个查询(主查询)的数据来源或判断条件的查询.常见的子查询有WHERE子查询,HAVING子查询,FROM子查询,SELECT子查询,EXISTS子查询,子查询要使用小括号(): WHERE子查询 在WHERE子句中进行使用查询 SELECT * FROM EMP WHERE SAL < (SELECT AVG(SAL)

sql serve数据库中对in查询到的数据排序

SELECT    * , ROW_NUMBER() OVER ( ORDER BY ffavoriteid ) AS numFROM      V_EBFavorite_TransportWHERE     FStatus IN ( 2, 1, 4 )                  ORDER BY CHARINDEX(RTRIM(CAST(FStatus AS VARCHAR(30))), '2, 1, 4')

SQL 中的连接查询

关于SQL的应用,肯定离不开查询,而相对复杂的查询,总是离不开对表的连接,单个表操作的并不罕见,但是在应用环境大多数的查询都是针对2.3个表甚至更多的表7,至于连接,有内连接.外链接.交叉连接之分,每种连接方式都有各自的查询关键字去执行.此时犹记学时对这些概念含糊不分,不知所谓,总是认为课本的知识玄幻深奥,概念晦涩难懂,当然我也时常归咎于是本校师生随手“复印”的教材. 一. 内连接(通过关联信息匹配数据) 1.等值连接(=,有重复)  2.不等值连接(不等式.大小于)   3.自然连接(=,无重

SQL中多条件查询括号的用途

界面: 代码 select id,routeName,routeCharacteristic,routeIntroductions,costDetail,participate,click,routeCategory,dineMenu,weather,isEnable,addPerson,addDate,competitiveProducts,luxury,onVacation,characteristic,hotRecommend,referencesPrice,specialPreferen

SQL中的连接查询及其优化原则

连接查询是SQL的主要任务,只有很好的掌握了连接查询及其优化方法才算是掌握了SQL的精髓所在.最近在面试中遇到了有关连接查询的问题,感觉回答的不是很好,总结一下. 具体示例请参考:http://www.w3school.com.cn/sql/sql_join.asp 总结: 连接查询原理与代码优化:假如要对table1和table2两个表进行连接查询,则DBMS首先会在table1中找到第一个元组,然后从头开始扫描table2表,逐一查找与table1第一个元组相对应的table2的元组,找到后

SQL中常用模糊查询的四种匹配模式

执行数据库查询时,有完整查询和模糊查询之分.一般模糊语句如下:SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式:1.%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请运用两个百分号(%%)表示.比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'将会把u_name为"张三","张猫三"."三脚猫","唐三藏&

SQL中常用模糊查询的四种匹配模式&amp;&amp;正则表达式

执行数据库查询时,有完整查询和模糊查询之分.一般模糊语句如下:SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式:1.%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请运用两个百分号(%%)表示.比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'将会把u_name为“张三”,“张猫三”.“三脚猫”,“唐三藏”等等有“三”的记录全找出来.另外,如果须要找出u_name中