2016-08-17 117 views
2

我真的不明白爲什麼這個LEFT JOIN沒有按照它應該的方式工作。應該有99條記錄來自cleaning_zzz_2016,就像我刪除LEFT JOIN時一樣。但是,當我添加LEFT JOIN時,它會下降到96.在cleaning_zzz_sales表中不存在CoNumber的一些表,因此我希望這些字段只是空白並且保留s.數據;但是,它正在刪除它們。我認爲這可能是由於WHERE s.Rep = 'ZZZ',但我不是100%肯定或如何解決這個問題。MS Access SQL記錄在LEFT JOIN中消失,不應該

SELECT j.CoNumber, j.CoName, s.Selling, s.Positions, s.Plans, '' AS Review, j.St, j.CE, j.SI, j.Tgt, ROUND(MAX(j.Comm) * 100) AS [Max of Comm], ROUND(MAX(j.Comm2) * 100) AS [Max of Comm2] 
FROM cleaning_zzz_2016 AS j 
LEFT JOIN cleaning_zzz_sales AS s 
    ON j.CoNumber= s.CoNumber 
WHERE s.Rep = 'ZZZ' AND s.RepYear = 2016 
GROUP BY j.CoNumber, j.CoName, j.St, j.CE, j.SI, j.Tgt, s.Selling, s.Positions, s.Plans 
ORDER BY j.CoNumber; 

回答

3

where子句中的任何條件都會直接過濾出行。您想直接在連接條件本身中添加左連接表中的所有條件。使用MS Access時,我相信當你有多個連接條件時,你需要小心括號。

所以我認爲,查詢應該是這樣的:

SELECT j.CoNumber, j.CoName, s.Selling, s.Positions, s.Plans, '' AS Review, j.St, j.CE, j.SI, j.Tgt, ROUND(MAX(j.Comm) * 100) AS [Max of Comm], ROUND(MAX(j.Comm2) * 100) AS [Max of Comm2] 
FROM cleaning_zzz_2016 AS j 
LEFT JOIN cleaning_zzz_sales AS s 
    ON (j.CoNumber= s.CoNumber 
    AND s.Rep = 'ZZZ' 
    AND s.RepYear = 2016) 
GROUP BY j.CoNumber, j.CoName, j.St, j.CE, j.SI, j.Tgt, s.Selling, s.Positions, s.Plans 
ORDER BY j.CoNumber; 
+0

謝謝,那就是答案。正在讓我瘋狂! – sockpuppet

+0

@ user3123109:您是否在Access中嘗試過上述查詢?在我看來,Access不允許在'ON'子句中使用非連接表達式。我認爲下面的@GordonLinoff提供的答案將是Access的最佳答案 – cha

+0

@cha:你讓我懷疑,因爲我沒有安裝MS Access來測試它。並且基於快速搜索,你是對的,有一些帖子指出這不應該是可能的。但我只是用MS Access 2010進行測試,並且能夠做到這一點。我想知道MS Access的後續版本中是否有所改變。我找不到任何證實這一點的信息。 – sstan

1

是的,你不應該在where列是在left join右側使用。只要將這些條件放在ON

+1

謝謝!這讓我瘋狂! – sockpuppet

1

的問題是where子句中的列。不幸的是,MS Access不允許在on中進行不斷的比較。您可以使用子查詢修復此問題:

SELECT j.CoNumber, j.CoName, s.Selling, s.Positions, s.Plans, 
     '' AS Review, j.St, j.CE, j.SI, j.Tgt, 
     ROUND(MAX(j.Comm) * 100) AS [Max of Comm], 
     ROUND(MAX(j.Comm2) * 100) AS [Max of Comm2] 
FROM cleaning_zzz_2016 AS j LEFT JOIN 
    (SELECT s.* 
     FROM cleaning_zzz_sales AS s 
     WHERE s.Rep = 'ZZZ' AND s.RepYear = 2016 
    ) s 
    ON j.CoNumber= s.CoNumber 
GROUP BY j.CoNumber, j.CoName, j.St, j.CE, j.SI, j.Tgt, s.Selling, s.Positions, s.Plans 
ORDER BY j.CoNumber; 
+0

我將不得不試一試。雖然關於引用'ON'語句中的常量的其他建議確實有效,但如果查詢已保存並關閉,然後在任一設計視圖或重新運行時重新打開,則會導致「JOIN IS NOT SUPPORTED」錯誤鎖定你,所以你必須重寫查詢。還沒有把它移到VBA中,但它最終應該是這樣,所以不確定那裏的行爲是什麼樣的。 – sockpuppet