只有In正常工作时,访问“Not In”查询不起作用

时间:2016-02-26 16:05:24

标签: sql ms-access ms-access-2010

我在下面给出的查询工作正常但我想使用“Not In”运算符而不是“In”但它没有给出结果:

SELECT DISTINCT OrderProdDetails.Priority
FROM OrderProdDetails
WHERE (((OrderProdDetails.Priority) In (SELECT DISTINCT OrderProdDetails.Priority 
FROM OrderProdDetails WHERE (((OrderProdDetails.OrdID)=[Forms]![UpdateOrder]![OdrID])))));

所需查询:

SELECT DISTINCT OrderProdDetails.Priority
FROM OrderProdDetails
WHERE (((OrderProdDetails.Priority) Not In (SELECT DISTINCT OrderProdDetails.Priority 
FROM OrderProdDetails WHERE (((OrderProdDetails.OrdID)=[Forms]![UpdateOrder]![OdrID])))));

基本上它是引用父窗体上的控件并基于子窗体中的控件我要填充优先级数字,即1,2,3如果输入该记录1,我想只得到2和3作为丢弃-down选项。

  ReocordID OrdID   Brand Name  Priority
   2          1       Org 1        2
   3          2       Org 2        1
   4          1       Org 1        1
   6          1       Org 1        3
   7          3       Org 3        1
   8          4       Org 1        1
   9          5       Org 2        1
   10         5       Org 2        2
   11         6       Org 1        1
  12          6       Org 2        2

如果有任何其他更好的方法,请建议。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您的问题很可能是Priority可以采用NULL值。在这种情况下,NOT IN无法按预期工作(尽管它在技术上工作)。通常的建议是始终使用NOT EXISTS子查询而不是NOT IN

但是,在您的情况下,我建议使用条件聚合:

SELECT opd.Priority
FROM OrderProdDetails as opd
GROUP BY opd.Priority
HAVING SUM(IIF(opd.OrdID = [Forms]![UpdateOrder]![OdrID], 1, 0)) = 0;

HAVING子句计算表单OdrId在订单中的次数。 = 0意味着它永远不存在。此外,您不再需要select distinct

答案 1 :(得分:0)

感谢您的快速回答,但我知道问题是什么,问题的答案是。

SELECT DISTINCT OrderProdDetails.Priority
FROM OrderProdDetails
WHERE (((OrderProdDetails.Priority) Not In (SELECT OrderProdDetails.Priority
FROM OrderProdDetails WHERE (((OrderProdDetails.OrdID)=[Forms]![UpdateOrder]![OdrID]) 
and ((OrderProdDetails.Priority) Is not null) ))));

我意识到问题只发生在那些优先级为空值的地方,所以我把检查设为非空,并且工作正常。

由于