未在运算符中运行时找不到记录

时间:2018-06-26 18:28:34

标签: sql union

我正在尝试从一张表中获取记录,但不包括某些记录(联盟中的订单号)。有人可以告诉我此查询有什么问题吗?运行后没有记录。

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]
                         )

3 个答案:

答案 0 :(得分:0)

我改用NOT EXISTS

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);

但是,我怀疑当前查询存在一些nullable问题。如果是这样,则需要在IS NOT NULL中使用subquery

答案 1 :(得分:0)

不要输入很棘手。我猜想OrderNo是可为空的,这就是为什么您没有任何行的原因。

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]
                        );

说明:

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

还有NOT NULL

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

答案 2 :(得分:0)

您应该能够避免完全使用子查询。听起来您要订购(来自FMD15_18的订单,说明中不包含“ AP”,并且订单号不在AP&C表中。如果是这样,您可以执行以下操作:

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

我不知道[FMD15_18].[Item Description]字段中的数据是什么,但是排除描述包含2个字母的项目似乎很费力。说明栏趋向于多长时间?可能会有一些包含“ AP”的记录被您无意中排除了吗?根据这种情况,将排除描述种类不同的项目,例如“ APPLE”,“ MAPLE SYRUP”和“ BURLAP”。