2010-08-19 87 views
1

在訪問我寫此查詢:訪問LEFT JOIN不能正常工作

Select 
    I.sysid, I.MemberNumber, I.Date, I.Distributer, 
    F.MemberNumber as FMember, F.Date as FDate, I.Distributer as FDistributer 
From Initial as I 
Left Join Final as F ON 
    I.MemberNumber=F.MemberNumber and 
    I.Distributer=F.Distributer and 
    I.Date>=F.Date-14 and 
    I.Date<=F.Date+14; 

但左連接不正確的行爲。在這個表中有更少的行,然後在Initial ...中,但它應該保留來自初始的所有行,因爲我正在使用左連接,對嗎?我已經在最初發現了幾行(如sysid = 7,這是Initial的關鍵字),但沒有進入此表。

+0

嘗試將非等聯接條件移動到WHERE子句中,即:LEFT JOIN END AS F ON I.MemberNumber = F.MemberNumber AND I.Distributer = F.Distributer WHERE I.Date> = F.Date- 14 AND I.Date <= F.Date + 14 - 這只是一個隱含的連接,而不是顯式的,可能會被Jet/ACE以相同的方式進行優化,但可能會更容易排除故障。 – 2010-08-20 20:57:20

回答

0

嘗試將其他字段添加到原始表並使用更新查詢添加額外的列。這樣你可以確定你不會丟掉任何列。

2

它可能與你的AND邏輯有關。一些()括號加入這包括所有像這樣:

Select 
    I.sysid, I.MemberNumber, I.Date, I.Distributer, 
    F.MemberNumber as FMember, F.Date as FDate, I.Distributer as FDistributer 
From Initial as I 
Left Join Final as F ON 
    (I.MemberNumber=F.MemberNumber and 
    I.Distributer=F.Distributer and 
    (I.Date>=F.Date-14) and 
    (I.Date<=F.Date+14)); 

此外,我認爲這是一個dateadd function,我會用這個來代替+/- 。

+0

體面的建議,但它沒有奏效。我仍然沒有從Initial獲得sysID = 7的行(還有一些其他人也沒有進入)。奇怪的部分是,如果我篩選結果在sysID = 7,它會找到該行,但沒有過濾器它不存在(如果我排序它,或使其成爲一個可用的,沒有7)。太離奇了。還有其他建議嗎? – Dan 2010-08-19 18:41:32

+2

@丹 - 開始減少代碼,找到你的答案是微不足道的。因此,首先擺脫日期的AND條件。運行查詢看看你是否得到數據。然後確保I和F的MemberNumber確實匹配。從那裏開始。這當然是真正簡單的事情(空,或不匹配,日期問題等)。 – JonH 2010-08-19 18:45:29

+0

由於Jet/ACE日期字段的整數部分是日期,因此如果您的日期數學計算日期爲零,則不需要使用DateAdd()。 – 2010-08-20 20:54:59

1

如果您在查詢設計器中,請確保已清除所有過濾器。我已經構建了你的表和sql,並且不能重現你的錯誤。

SELECT I.sysid 
    , I.MemberNumber 
    , I.Dated 
    , I.Distributer 
    , F.MemberNumber 
    , F.Dated AS FDated 
    , F.Distributer AS FDistributer 
FROM Initial AS I 
LEFT JOIN Final AS F 
ON I.Distributer = F.Distributer 
     AND I.MemberNumber = F.MemberNumber 
     AND I.Dated>=F.Dated-14 
     AND I.Dated<=F.Dated+14;