2016-01-11 9 views
0

我正在做一個SQL鍛鍊,上面寫着:獲得錯誤結果集使用時=在MySQL的日期練習

寫SQL語句來顯示或者未在日發表這些訂單2012-09- 10,由身份證號碼爲505及以下的推銷員或購買金額爲1000.00及以下的訂單發行。

好吧,當我看着我的查詢與正確答案,他們似乎在並行邏輯,但我得到錯誤的結果集。任何人都可以幫助我理解爲什麼我的查詢會出錯嗎?

我的查詢:

SELECT * FROM orders WHERE 
((ord_date != '2012-09-10' AND salesman_id <= 505) OR 
purch_amt <= 1000); 

正確答案:

SELECT * FROM orders WHERE NOT 
((ord_date = '2012-09-10' AND salesman_id > 505) 
OR purch_amt > 1000.00); 

下面首先是我的結果集的屏幕截圖,再加上正確的結果集。我明白我的結果集是錯的,我只是不明白爲什麼我的查詢會得到這些信息。

This is the result I get

This is the correct result set

+0

你想知道爲什麼即使你過濾了你的結果,你爲什麼得到salesman_id> 505? – minatverma

+1

在你的練習中有3個條件可以加入。所以你也應該澄清哪兩個在一起(1,2)或(2,3)。 – minatverma

+1

您的查詢是正確的關於'<= 1000'。這個問題的原始語言和措辭是什麼?因爲英語不明確,所以「不是......和」,它使用「......或者」不正確。 – philipxy

回答

1

根據您的查詢,

SELECT * FROM orders WHERE 
((ord_date != '2012-09-10' AND salesman_id <= 505) OR 
purch_amt <= 1000); 

你得到ord_no 70007行,因爲purch_amount(948.5)< 1000是TRUE,而另一種情況是FALSE。所以TRUE或FALSE的計算結果爲TRUE,並返回該行。

你得到ord_no 70009行,因爲purch_amount(270.65)< 1000是TRUE,而另一種情況是FALSE。所以TRUE或FALSE的計算結果爲TRUE,並返回該行。

基於正確的答案,

SELECT * FROM orders WHERE NOT 
((ord_date = '2012-09-10' AND salesman_id > 505) 
OR purch_amt > 1000.00); 

where條件相當於 (ord_date != '2012-09-10' OR salesman_id <= 505) AND purch_amt <= 1000.00因爲NOT。您可以使用上述數據驗證條件。

答案也可以表示爲

SELECT * FROM orders 
WHERE ord_date != '2012-09-10' AND (salesman_id <= 505 OR purch_amt <= 1000.00); 
+0

「正確」的答案並不反映英語重新purch_amt和英語是不明確的不。 – philipxy

+0

我看到我把邏輯搞亂了。這個答案很好,描述性強。謝謝! – trevalexandro

1

在您的查詢,在正確答案的對立面,不是不換行的所有條件。直到現在,似乎很明顯,是的。

但後果是,你回到

  • 滿足第一條件(即使是那些_not_satisfying:第二個)中的所有記錄
  • 所有滿足第二個條件(記錄甚至是那些_not_satisfying第一一個)

因此,結果集不僅包括預期(正確答案)記錄,還包括那些僅滿足兩個條件之一的記錄。


編輯,在閱讀@Philipxy的評論後。

我同意練習的表述有些含糊。
但我選擇了使用上述「正確答案」的理由,該答案清楚地顯示了需要什麼。在此基礎上,我們可以瞭解其他查詢失敗的原因。

+0

好的,我明白我做錯了什麼。謝謝! – trevalexandro