2015-10-06 36 views
1

我有这个疑问:不同的结果在SQL

SELECT 
    customerName, country 
FROM 
    customers 
WHERE 
    customernumber 
NOT IN 
    (SELECT 
     customernumber 
    FROM 
     payments 
    WHERE 
     amount < 40000) 
AND 
    customernumber 
IN 
    (SELECT 
     customernumber 
    FROM 
     payments 
    GROUP BY 
     customernumber 
    HAVING 
     COUNT(amount) >=2) 

我有一些结果,但是当我改变not inin<>=我收到完全不同的结果:

SELECT 
    customerName, country 
FROM 
    customers 
WHERE 
    customernumber 
IN 
    (SELECT 
     customernumber 
    FROM 
     payments 
    WHERE 
     amount >= 40000) 
AND 
    customernumber 
IN 
    (SELECT 
     customernumber 
    FROM 
     payments 
    GROUP BY 
     customernumber 
    HAVING 
     COUNT(amount) >=2) 

我完全糊涂了这一点。在这里你可以看到模式:http://www.learntosql.com/retailer-database/

+5

查询1 - 找到至少有两笔付款的客户,其中没有一笔金额低于40000.查询2 - 查找至少有两笔付款的客户,其中一笔付款超过(或相等)40000。仔细查看这些说明。查询是真实不同的。 –

+1

第一个选择所有从未支付少于40000的顾客,第二个支付至少一次支付超过40000的所有顾客。 –

+2

当不在时,要小心NULL。你可能会得到一个非常意想不到的结果......不是很容易理解。 – jarlh

回答

2

第一次查询的这个部分:

(SELECT 
     customernumber 
    FROM 
     payments 
    WHERE 
     amount < 40000) 

选择所有谁曾经支付了不到40000的客户。在第二个查询中,等价部分选择所有曾经支付超过40,000的客户。由于有些客户会做出两种以上和40 000金,这意味着两套不一定是相互排斥的(有些人会在这两个),因此反转INNOT IN和改变<>=不一定会产生相同的结果。

+0

不要忘记从未进行任何付款的客户。 –

+0

@JakubKania - 它们已经被查询中的其他条件过滤掉了。 –

+0

感谢您的回答,现在它是有道理的。 –