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)

 

開發中遇到該問題記錄下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM