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 ...
随机推荐
- E20180327-hm
renew vt. 补充; 重新开始; 使更新; 使恢复; vi. 重申,重复强调; 重新开始; renewal n. 重建,重生; 更新,革新; 重申; 合同的续订;
- 更新gitignore
更新: 2017/04/26 修正windows版本下的命令 git rm -r --cached . (Windows 下的版本) 更新: 2017/06/06 mac下的命令也 ...
- POJ1787 【完全背包+物品计数+路径输出】
题意: 有1,5,10,25四种硬币,给每种硬币的数量和要组合成的价值,求刚好达到价值时用的硬币最多,然后还要输出具体的用的数量 前言: 一开始是偶然看见了kuangbin爷的题解说是完全背包+路径, ...
- bzoj 5019: [Snoi2017]遗失的答案【dp+FWT】
满足GL的组合一定包含GL每个质因数最大次幂个最小次幂,并且能做限制这些数不会超过600个 然后质因数最多8个,所以可以状压f[s1][s2]为选s1集合满足最大限制选s2集合满足最小限制 dfs一下 ...
- Contest Hunter 0103最短Hamilton路径 【状压dp】 By cellur925
题目传送门 Hamilton路径的定义:从0(起点)到n-1(终点)不重不漏地经过每个点恰好一次. 由于数据范围非常小,考虑状压.如NOIP2017宝藏一题,把状态压缩设为n个点是否已到达的二进制数. ...
- Centos 7.x 配置Gitlab
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 1. 安装并配置必要的依赖关系 如果你想使用 Postfix 发送邮件,请在安装过程中根 ...
- tcp聊天交互
#****setver端 import socket sk = socket.socket() adress = ('127.0.0.1', 8032) sk.bind(adress) sk.list ...
- Educational Codeforces Round 18 D
Description T is a complete binary tree consisting of n vertices. It means that exactly one vertex i ...
- ubuntu14.04 在Dash中添加条目并把它放到启动器上
1. 创建studio.desktop,内容如下:注意路径. [Desktop Entry] Version=2.2.3 Name=Android Studio Exec=/home/你的用户名/an ...
- 使用statement接口实现增,删,改操作