一、問題
用以下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)
開發中遇到該問題記錄下