2012-01-12 55 views
0

我不確定爲什麼這樣表現。我需要根據一些標準從兩個表中選擇幾個值,這些標準應該從我在下面嘗試的查詢中清楚。從兩個表中選擇給出比預期更多的行

query = @"SELECT n.borrower, a.sum, n.lender FROM Notification AS n, Acknowledgment AS a 
      WHERE [email protected] AND n.id IN (SELECT parent_id FROM Acknowledgment 
              WHERE [email protected] AND [email protected])"; 

這會返回比預期更多的行(12)。

我有兩個表的通知和確認都有字段「總和」。當我嘗試下面的查詢時,按照預期給出正確的3行。

@"SELECT n.borrower, n.sum, n.lender FROM Notification AS n 
    WHERE [email protected] AND n.id IN (SELECT parent_id FROM Acknowledgment 
            WHERE [email protected] AND [email protected])"; 

現在我需要讓我需要a.sum而不是n.sum擴展這個查詢。但是當我嘗試第一個查詢時,它會給出更多的行,我的意思是WHERE條件不起作用。我不知道,如果它與MS Access的怪癖或查詢有問題。如果我的查詢看起來很好,我很欣賞在訪問中的替代實現'因爲它根本不起作用! :)

我已閱讀here不同的數據庫實現以不同的方式選擇。說不上來,如果它的東西具體的訪問..

從Li0liQ建議之後,我嘗試這樣做:

@"SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
    INNER JOIN Acknowledgment AS a ON a.parent_id = n.id AND [email protected] AND [email protected] 
    WHERE [email protected]" 

但我現在得到「不支持JOIN表達」一個錯誤。

回答

2

這是預期的,因爲乘積的行爲:

FROM Notification AS n, Acknowledgment AS a 

如果你有10個通知和5個確認,你會得到50行的結果,代表的通知和確認的所有可能的組合。該集合隨後被WHERE子句過濾。 (這是對SQL,而不是具體到MS Access標準。)

這聽起來像你需要一個JOIN

FROM Notification AS n INNER JOIN Acknowledgement AS a ON n.id = a.parent_id 

然後,您可以擺脫子查詢:

WHERE [email protected] AND [email protected] AND [email protected] 

編輯

根據nawfal的要求,這裏是他到達的解決方案,基本上包含上述記錄修正案:

string query = @"SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
      INNER JOIN Acknowledgment AS a ON a.parent_id=n.id 
      WHERE [email protected] AND [email protected] AND [email protected]"; 
+0

只是完美。接近我所想的東西! – nawfal 2012-01-12 18:17:56

+0

不需要子查詢。必須滿足這個條件! – nawfal 2012-01-12 18:19:41

+1

@nawfal,但應該可以通過將這些條件放入'WHERE'子句來獲得相同的結果,這比子查詢更有效。 – phoog 2012-01-12 18:21:46

1

在第一個查詢中,您似乎試圖執行JOIN
但是,您最終會執行CROSS JOIN,即您查詢兩個表中的所有可能組合(我敢打賭,您在Acknowledgment表中有4行)。

我希望下面的查詢可以做你認爲正確的方向的把戲,或至少幫助:只有通過重構查詢

SELECT 
    n.borrower, a.sum, n.lender 
FROM 
    Notification AS n 
INNER JOIN 
    Acknowledgment AS a 
ON 
    a.parent_id = n.id 
WHERE 
    [email protected] AND [email protected] AND [email protected] 
+0

這似乎是一個完美的答案。回到你們一些測試:) – nawfal 2012-01-12 18:21:50

+0

當我運行這個查詢時,我得到「加入」不支持來自Access的錯誤消息!但是我記得在訪問之前成功完成了LEFT OUTER JOIN – nawfal 2012-01-12 18:27:58

+0

@nawfal不支持連接,因爲您不能在'JOIN'子句中使用'AND [email protected] AND a.deleted = @ del1'。連接表達式應該將連接一側的列與連接的另一側關聯起來。這些表達式僅使用a中的列。它們可以併入WHERE條款。 – phoog 2012-01-12 19:59:33

0

東西似乎是錯誤的訪問,我能得到這個工作由回答者以這種方式提供:

string query = SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
       INNER JOIN Acknowledgment AS a ON a.parent_id=n.id 
       WHERE [email protected] AND [email protected] AND [email protected]; 
+1

這在功能上等同於我的答案所隱含的查詢。你爲什麼認爲Access有什麼問題? – phoog 2012-01-12 20:01:09

+0

@phoog功能上。我認爲我在問題中更新的查詢可以很好地適用於MySQL(我更習慣於),而不是在Access中。在使用MySQL和Access之後,這是我的直覺。我在JOIN語句中從未遇到任何MySQL問題。我可以理解,如果我的JOIN語句的語法錯誤,但是這裏Access只是說JOIN表達式不受支持。從互聯網上閱讀更多內容後,我可以讓它工作 – nawfal 2012-01-12 20:09:48

+0

讓我來說說MS Access的另一個怪癖。如果我通過參數和佔位符傳遞值來更新,我需要$ %% ^將它傳遞給EXACT EXACT EXACT命令,查詢讀取這些值。當你有一些複雜的查詢'cos u cant所有的時間都在查詢查詢並找出哪個查詢是第一次執行的,順序等。MySQL(我相信像DB2等其他強大的數據庫)也沒有這個問題。另一個,Access不支持我可以在其他數據庫中使用的許多頂級關鍵字。所有這些讓我覺得它的一個Access的東西 – nawfal 2012-01-12 20:11:40