2012-01-10 42 views
0

我試圖在兩個表上執行左連接以獲取表2中不存在或狀態爲空的所有值:Microsoft Access 97/XP左側加入多列失敗 - Vista/7正常

表1具有ROID只要

表2具有ID long,Type long和Status文本。

這工作正常,在Vista和Win 7(我得到不V中存在的所有記錄),但我得到的XP沒有記錄,

SELECT roid 
    FROM 
    wo AS w LEFT JOIN VFlag As V ON (w.roid = V.ID AND V.Type = 2) 
    WHERE 
    (V.Status is Null) 

當我刪除了V.Type = 2 ,它適用於XP/Vista/7的罰款,但我需要在限定型以及:

SELECT roid 
    FROM 
    wo AS w LEFT JOIN VFlag As V ON (w.roid = V.ID) 
    WHERE 
    (V.Status is Null) 

這無論是在使用ADO和VISDATA VB6。嘗試WHERE isnull(V.Status)沒有任何區別。 XP機器(兩個測試)是SP3。

回答

1

您是否嘗試將V.Type = 2放置在WHERE子句中而不是連接中?

+0

試過,不工作。它在該表中可能沒有匹配的ID。 – 2012-01-10 17:26:13

+0

只是好奇,你有沒有嘗試過在XP上運行時看到V.Type具有的值(「SELECT,roid,V.Type ...」)嗎?在Vista/7上?所有操作系統上的所有表都包含相同的數據嗎? – 2012-01-10 17:53:29

+0

是的,我把數據庫複製到了幾臺機器上。繼續你之前說過的話,我想我可以通過WHERE獲得它(V.Type是Null或V.Type = 2)。我仍然寧願找到原因。 – 2012-01-10 17:58:28

0

首先,它是一個known issue Access的外連接不符合標準,產生意想不到的結果,因此結果表達不那麼好。 The SQL Server team wanted to fix this 'bug' but was scuppered by the Windows Team;隨後發動機不太可能被固定。

其次,SQL中的空值通常是災難。 SQL標準未能定義三值邏輯。訪問專門也沒有使用三值邏輯,並且有許多不一致。最好避免使用null值,並且外連接明確設計爲生成空值。

第三,在SQL中總是有很多方法來表達同樣的東西。您需要的關係運算符是semi difference a.k.a. antijoin。您的規範讀取「獲取表2中不存在的所有值」,因此請考慮使用NOT EXISTS

SELECT roid 
    FROM wo AS w 
WHERE NOT EXISTS (
        SELECT * 
        FROM VFlag As V 
        WHERE w.roid = V.ID 
          AND V.Type = 2 
       ); 

我不知道是否應該子查詢還測試V.Type IS NULL因爲你已經包含在規範實施細則(LEFT OUTER JOIN),我不能只見樹木的木材:)

0

我有點晚了 - 但我剛剛遇到了什麼似乎是在Access 2003相同的問題 似乎這個錯誤已在最新的JET中修復。因此可以很好地解釋症狀,你看到了如何在Windows 7

MS KB275058

固定

mikecro