2012-10-12 27 views
1

我有以下查詢寫在MS Access訪問 - 在哪裏,或不工作

SELECT DISTINCT Table1.ColumnA, Table1.ColumnB,Table1.ColumnC,Table1.ColumnD,Table1.ColumnE 
FROM Table2 
RIGHT JOIN Table1 ON (Table2.ColumnB = Table1.ColumnF) 
WHERE (Table1.ColumnF <>28) OR (Table1.ColumnF<>29) 
  1. 試過有和沒有括號
  2. 當我只有一個WHERE語句的262個記錄再往160條記錄,如預期的那樣
  3. 當我通過OR連接兩個條件時,記錄回到262,顯然沒有做到預期的。即使只有第一個條件,我也不應該回到262條記錄。

我的問題是我的查詢出了什麼問題,尤其是因爲它涉及到WHERE XXX或XXX?

其次,RIGHT JOIN語句對後續WHERE語句的結果是否有任何影響。

第三,如果我不能組合RIGHT JOIN和WHERE,那麼將條件應用於依賴RIGHT JOIN的查詢的最佳方式是什麼?

感謝任何幫助!

回答

6

取代你:或與

WHERE (Table1.ColumnF <>28) AND (Table1.ColumnF<>29) 
+0

你爲什麼要用AND?這是不是意味着兩個條件都必須實現?在我的情況下,當看到一個28被忽略的時候,一個29主要不會出現,直到後來的記錄。 @Jason – jacobronniegeorge

+1

因爲對於X的任何值,包括28和29,「(X <> 28)或(X> 29)」爲真。 – Jason

+0

對不起,我不明白,28和29怎麼能不等於28和29? ?? – jacobronniegeorge

3

你可以用這個來代替:

WHERE Table1.ColumnF Not In (28,29) 

這一做法清楚簡明地表達你的意圖。現在,您已經解決了ORAND對於您的WHERE條件的問題,但此建議似乎不太有用。但是,請記住,當你有更多這樣的條件時。 Not In (28,29,32,40,119)比4 AND更容易編寫和理解。

+0

現在基於這個特定的語句,你將如何結合另一個附加條件,即列G是否...並且如果列G是NULL保留該值並且不要忽略? – jacobronniegeorge

+0

我不明白你在那裏問什麼。你的意思是? ... WHG ColumnG爲空且ColumnF不在(28,29)'... IOW,要返回一行,ColumnG和ColumnF條件都必須滿足? – HansUp

+0

讓我解釋一下:我有一個127條記錄的列表,列F(所有者ID1)和列G(所有者ID2)兩列相關。當且僅當在F欄28或29欄中出現,而在G欄中,如果它們沒有被省略,則不存在任何值。因此邏輯上1.檢查F列是否有28或29 2.如果它有28或29,那麼檢查該行的G列是否爲空,3.如果爲null,則不要忽略,4 。否則省略在G列中有值的行 – jacobronniegeorge