No records found when running not in operator

泪湿孤枕 提交于 2020-01-15 09:25:42

问题


I am trying to get records from one table excluding some records (Order No.'s in the Union). Can anybody tell me what could be wrong with this query. I am getting no records after running it.

SELECT * 
FROM [dbo].[FMD15_18] 
WHERE [OrderNo] NOT IN  ((SELECT OrderNo 
                          FROM [dbo].[FMD15_18] 
                          WHERE [Item Description] Like '%AP%')
                          UNION ALL 
                          SELECT [OrderNo] FROM [dbo].[AP&C]
                         )

回答1:


I would use NOT EXISTS instead :

SELECT t.*
FROM [dbo].[FMD15_18] t
WHERE NOT EXISTS (SELECT 1 
                  FROM [dbo].[FMD15_18] t1 
                  WHERE t1.OrderNo = t.OrderNo AND 
                        t1.[Item Description] Like '%AP%') AND
      NOT EXISTS (SELECT 1 
                  FROM [dbo].[AP&C] a
                  WHERE a.OrderNo = t.OrderNo);

However, i suspect some nullable issues with current query. If so, then you need to fiter out with IS NOT NULL in subquery.




回答2:


NOT IN is tricky. I guess that OrderNo is nullable that is why you don't get any rows.

SELECT * 
FROM [dbo].[FMD15_18] 
WHERE [OrderNo] NOT IN (SELECT COALESCE(OrderNo, '^')
                        FROM [dbo].[FMD15_18] 
                        WHERE [Item Description] Like '%AP%'
                        UNION ALL 
                        SELECT COALESCE([OrderNo], '^') FROM [dbo].[AP&C]
                        );

Explanation:

1 IN (1, NULL)
<=> 
1=1 OR 1 = NULL 
-- 1 row returned

And NOT NULL:

1 NOT IN (1, NULL)
1!=1 AND 1 != NULL
-- always not true
-- always 0 rows returned



回答3:


You should be able to avoid using sub-queries entirely. It sounds like you want orders (from FMD15_18) where the description does not contain "AP", and the order number is not in the AP&C table. If that's the case, you could do something like the following:

select FMD15_18.*
from FMD15_18
    left join [AP&C] on
        [AP&C].OrderNo = FMD15_18.OrderNo
where
    FMD15_18.[Item Description] NOT like '%AP%'
    and [AP&C].OrderNo is null

I don't know what kind of data is in the [FMD15_18].[Item Description] field, but it seems heavy-handed to exclude items where the description contains 2 letters. How long does the description column tend to be? Might there be records that contain "AP" that you're excluding inadvertently? Items with descriptions as varied as "APPLE", "MAPLE SYRUP", and "BURLAP" would be excluded based on this condition.



来源:https://stackoverflow.com/questions/51049380/no-records-found-when-running-not-in-operator

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!