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)

开发中遇到该问题记录下
SQL 中 NOT IN 查询不到数据的更多相关文章
- SQL 中 not in 查询不到数据问题
在开发的过程中,遇到过not in 始终查询不到数据问题 select * from T_CustomerInfo where CustomerID not in (select CustomerID ...
- 在SQL中直接把查询结果转换为JSON数据
下面这篇中,已经有准备一些数据: <MS SQL server对象类型type>https://www.cnblogs.com/insus/p/10903916.html 为前端服务,直接 ...
- C#EF中,使用类似于SQL中的% 模糊查询
最近在做项目的时候需要使用到模糊查询,但是后台使用EF写的 而不是ADO或者是Dapper,如果是这样的话,我们就可以使用Sql语句直接进行模糊查询 现在我们需要在LINQ中使用类似于模糊查询 在EF ...
- SQL中一次插入多条数据
SQL中insert一次可以插入一条数据,我们有三种方法可以一次性插入多条数据. 1. 语法:select 字段列表 into 新表 from 源表 注意事项:此种方法新表是系统自动创建,语句执行前不 ...
- SQL中的子查询
目录 WHERE子查询 HAVING子查询 FROM子查询 SELECT子查询 EXISIT子查询 查询薪资排名的员工信息(面试) z子查询就是将一个查询(子查询)的结果作为另一个查询(主查询)的数据 ...
- SQL中多条件查询括号的用途
界面: 代码 0 posted @ 2009-12-15 13:28 唔愛吃蘋果 阅读(8640) 评论(0) 编辑 收藏
- SQL 中的连接查询
关于SQL的应用,肯定离不开查询,而相对复杂的查询,总是离不开对表的连接,单个表操作的并不罕见,但是在应用环境大多数的查询都是针对2.3个表甚至更多的表7,至于连接,有内连接.外链接.交叉连接之分,每 ...
- SQL中常用模糊查询的四种匹配模式&&正则表达式
执行数据库查询时,有完整查询和模糊查询之分.一般模糊语句如下:SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式:1.%:表示任意0个或多个字 ...
- SQL中的连接查询及其优化原则
连接查询是SQL的主要任务,只有很好的掌握了连接查询及其优化方法才算是掌握了SQL的精髓所在.最近在面试中遇到了有关连接查询的问题,感觉回答的不是很好,总结一下. 具体示例请参考:http://www ...
随机推荐
- XTU1266:Parentheses(贪心+优先队列)
传送门 题意 从左到右有n个连续的组,每一组有Li个括号,要么全是左括号,要么全是右括号,以及该组的每一个左括号翻成右括号, 或者右括号翻成左括号的花费Di.可以对这n个组的括号进行翻转,每一个括号都 ...
- hdoj1596【spfa,松弛】
积压很久的一道...一看直接spfa水过..但是看那个safest怎么求得?松弛的时候取大. #include <bits/stdc++.h> using namespace std; t ...
- Codeforces732D Exams
显然要二分答案,然后对于一个天数,我们来判断是否可以通过所有考试,这里就贪心来安排就好了. 首先我们希望每门课的考试时间越晚越好,然后就是先复习最早开始的考试. #include <bits/s ...
- PJzhang:贷款逾期与失信被执行人
猫宁!!! 最近看到一家网贷机构在APP上的温馨提示,提到了网贷逾期与个人征信的关系以及向客户发放贷款的7项基本原则. 如下: 贷款申请及逾期告知 尊敬的客户,感谢您选择####股份有限公司为您提供贷 ...
- 使用selesium和pytesseract识别验证码,达到登录网页目的
关于验证码问题,大多可以在网上了解到目前有四种解决方案:1.开发注释验证码2.开发开一个“后门”,设置一个万能码,输入万能码则通过3.通过cookies绕过验证码4.图形识别技术 前三种是比较快速也是 ...
- Django Views and URLconfs
碧玉妆成一树高,万条垂下绿丝绦. 不知细叶谁裁出,二月春风似剪刀. 原文尽在:http://djangobook.com/ 转载请注明出处:http://www.cnblogs.com/A-FM/p/ ...
- C++ 操作符重载 (operator)
重载不能改变操作符的优先级 如果一个内建操作符是一元的,那么所有对它的重载仍是一元的.如果是二元的重载后也是二元的 下面看一个有代表性的例子:: 头文件Complex.h: #includeusing ...
- 递推DP HDOJ 5459 Jesus Is Here
题目传送门 题意:简单来说就是sn = sn-1 + sn-2递推而来,求其中所有c字符的:∑i<j:sn[i..i+2]=sn[j..j+2]=‘‘cff"(j−i) mod 530 ...
- JAVA常用知识总结(三)——JAVA虚拟机
先附一张JAVA虚拟机内存结构图: 其中JAVA虚拟机的线程问题<为什么JAVA虚拟机分为线程共享和非线程共享?>一文中已经有详细介绍,本文从面试中常问的一些JAVA虚拟机问题出发,主要从 ...
- CF 602 D. Lipshitz Sequence 数学 + 单调栈 + 优化
http://codeforces.com/contest/602/problem/D 这题需要注意到的是,对于三个点(x1, y1)和(x2, y2)和(x3, y3).如果要算出区间[1, 3]的 ...