0

嗨,我不确定为什么它会产生不同的结果。有人可以让我知道我的错误是什么吗?

此查询返回 2 行记录

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod     
WHERE   Prod.intDepartmentRef =4  

bintProductRef
--------------------
164475
164476

这个查询返回 1 行记录

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod    
        WHERE  intCatRef = 132

bintProductRef
--------------------
164475

NOT EXISTS,当结合上述 2 个查询时,它应该返回 164476,但没有输出。

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod     
      WHERE   Prod.intDepartmentRef =4  
      AND NOT EXISTS (      
        SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod    
        WHERE  intCatRef = 132)

NOT IN,这返回 1 行数据,即 164476,这是正确的。

 SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod     
      WHERE  Prod.intDepartmentRef =4  
       AND Prod.bintProductRef NOT IN (      
        SELECT  Prod.bintProductRef FROM Prod_ProfileTbl Prod    
        WHERE  intCatRef = 132)
4

3 回答 3

1

在您的“不存在”中,您的主查询和不存在的子查询之间没有任何链接。

NOT EXISTS 评估您的子查询,它选择了一些东西,因此“某物”存在并且您的 NOT EXISTS 将为 false 并且不返回任何行。

如果您希望使用 EXISTS,您需要将两个查询链接在一起;像这样的东西:

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod   
WHERE   intDepartmentRef =4  
AND NOT EXISTS (      
    SELECT 1 FROM Prod_ProfileTbl Prod2    
    WHERE  intCatRef = 132 AND prod.intCatRef = prod2.intCatRef)

,但出于您的目的, NOT IN 或类似的方法是更好的方法。

于 2013-10-29T06:39:03.650 回答
0

NOT EXISTS (...) 表示只有括号中的内容不返回任何内容才会为真。正如您所展示的,它确实返回了一行,因此 NOT EXISTS 为假,因此 AND 为假,您不会得到任何返回的行。

于 2013-10-29T06:36:37.720 回答
0
SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod     
      WHERE   Prod.intDepartmentRef =4  
      AND NOT EXISTS (      
        SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod    
        WHERE  intCatRef = 132)

这部分代码有一个逻辑,它比 Prod.intDepartmentRef =4 并且不应该存在查询来返回结果。请注意,两个谓词应该变为真,因此 where 子句变为真。但也不是这个查询:

SELECT Prod.bintProductRef FROM Prod_ProfileTbl Prod    
            WHERE  intCatRef = 132

存在一个有结果,所以第二个谓词变为假,你有:真假--->假,所以没有结果返回。

于 2013-10-29T06:38:44.997 回答