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