1. 程式人生 > >SQL 中 NOT IN 查詢不到數據

SQL 中 NOT IN 查詢不到數據

運算符 clas 參與 http ogr nbsp gpo 應該 pic

一、問題

用以下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 查詢不到數據