2015-03-19 66 views
1

我最近遇到了這個問題。我試圖刪除列名上特定字符的行。我通過創建幾個臨時表如下所示:SQL - 逐步過濾

CREATE TEMPORARY TABLE tri1 as 
SELECT * FROM loading WHERE postcode != 'n/a'; 

CREATE TEMPORARY TABLE tri2 as 
SELECT * FROM tri1 WHERE postcode != '--'; 

CREATE TEMPORARY TABLE tri3 as 
SELECT * FROM tri2 WHERE postcode != 'n-a'; 

CREATE TEMPORARY TABLE tri4 as 
SELECT * FROM tri3 WHERE postcode != '99999'; 

這個冗長的解決方案運行良好。

但是我第一次嘗試用這個SQL查詢:

CREATE TEMPORARY TABLE tri1 AS 
SELECT * FROM loading WHERE (postcode != 'n/a' OR postcode != '--' OR postcode != 'n-a' OR postcode != '99999'); 

的問題是,我得到更少的行,當我做了連續級聯臨時表的排序像上面不是返回。

爲什麼?

謝謝。

+0

你能指定模式並給我們一些背景嗎? – 2015-03-19 09:03:51

+0

您好@TimBiegeleisen,您需要什麼樣的上下文,以及您的模式是什麼意思?你的意思是像表或其他東西的架構? – 2015-03-19 09:05:06

回答

2

使用如此多的臨時表並不是解決問題的方法。你只使用一個查詢是正確的,但是你的邏輯錯誤。以下是更正後的查詢:

CREATE TEMPORARY TABLE tri1 AS 
SELECT * FROM loading 
WHERE (postcode != 'n/a' AND postcode != '--' AND postcode != 'n-a' AND postcode != '99999'); 

問題是,我得到更少的返回行的時候我做了連續級聯臨時表

你正在讓記錄漏網之魚裂縫比。根據你的邏輯,一條記錄必須有全部條件被拒絕。例如,一個沒有' - '的記錄會通過,即使它有'99999'。

管理上述查詢的邏輯規則稱爲德摩根定律,您可以read about it here

+0

謝謝@TimBiegeilsen我之前有過這個問題。我不知道何時使用'或'或'和'。我需要讀更多關於德摩根的法律。 – 2015-03-19 09:48:27