2015-10-06 101 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

感謝您的回答,現在它是有道理的。 –