2012-09-24 155 views
6

更新在底部。OUTER JOIN結果缺少行,沒有WHERE子句(找到解決方法)

我試圖做一個自我外連接,對於每個記錄,返回它和所有其他記錄發生比它晚,或NULL,如果它本身是最新的記錄。這是我的SQL代碼:

SELECT A.[CR#], A.REGIS_STATUSDATE, B.REGIS_STATUSDATE 
FROM CR_ADMIN_REGIS_STATUS A LEFT OUTER JOIN CR_ADMIN_REGIS_STATUS B 
ON A.[CR#]=B.[CR#] AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 

我的問題是,這是當,對於給定[CR#],A.REGIS_STATUSDATE是最大的(因此B.REGIS_STATUSDATE不能比它更大的),那行不包含在我的結果中。

例如,如果CR_ADMIN_REGIS_STATUS看起來是這樣的:

CR# REGIS_STATUSDATE 
1  5/1/12 
1  5/2/12 
1  5/3/12 
2  5/1/12 
2  5/2/12 

我希望我的查詢結果是

CR# A.REGIS_STATUSDATE B.REGIS_STATUSDATE 
1  5/1/12    5/2/12 
1  5/1/12    5/3/12 
1  5/2/12    5/3/12 
1  5/3/12    NULL 
2  5/1/12    5/2/12 
2  5/2/12    NULL 

相反,我得到這樣的:

CR# A.REGIS_STATUSDATE B.REGIS_STATUSDATE 
1  5/1/12    5/2/12 
1  5/1/12    5/3/12 
1  5/2/12    5/3/12 
2  5/1/12    5/2/12 

鑑於我的查詢是一個LEFT OUTER JOIN,並且我沒有WHERE子句,我期望我原始表中的所有行都是在結果中,但事實並非如此。我在這裏錯過了什麼?

編輯:這是在Access 2007中

更新:我決定去看看,如果我複製的表CR_ADMIN_REGIS_STATUS的部分成一個單獨的表,跑到我對這個查詢會發生什麼。即使當我直接將整個表格複製到新表格(手動)時,查詢仍然有效!這只是實際上覆制和粘貼時的情況,當我將SELECT * INTO另一個表格時,問題仍然存在。
後來我發現,如果我跑了查詢對

SELECT * 
FROM CR_ADMIN_REGIS_STATUS 
UNION ALL SELECT TOP 1 * 
FROM CR_ADMIN_REGIS_STATUS; 

而不是CR_ADMIN_REGIS_STATUS本身我的查詢返回所需的結果。奇怪的。我也有類似的查詢,從一開始就工作的類似的表,所以看起來這是一個限於這個表的問題。

+1

哪些DBMS您使用的?訪問? –

+0

那麼這讓我撓我的頭 –

+0

在MS Access 2010中運行您的查詢我得到您的預期結果。 – Fionnuala

回答

1

你不會錯過任何東西。 如果發生這種情況,這是一個錯誤。

MS-Access使用的引擎有一些錯誤。我在與「複雜」ON條件的聯合中看到過類似的inavlid行爲。查看另一個SO問題,其中訪問提供了越野車結果:Why does my left join in Access have fewer rows than the left table?

您可以使用SQL-Server,Oracle,Postgres甚至MySQL中的相同數據嘗試查詢,並且您將獲得正確的預期結果。


作爲一種變通方法,你可以嘗試用UNION重寫查詢,但誰也不能肯定是否正確:

SELECT A.[CR#], A.REGIS_STATUSDATE, B.REGIS_STATUSDATE 
FROM CR_ADMIN_REGIS_STATUS A 
    INNER JOIN CR_ADMIN_REGIS_STATUS B 
    ON A.[CR#]=B.[CR#] 
    AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 

UNION ALL 

SELECT A.[CR#], A.REGIS_STATUSDATE, NULL 
FROM CR_ADMIN_REGIS_STATUS A 
WHERE NOT EXISTS 
     (SELECT * 
     FROM CR_ADMIN_REGIS_STATUS B 
     WHERE A.[CR#]=B.[CR#] 
      AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 
    ) ; 
+0

我在MS Access中獲得預期的結果。 – Fionnuala

+0

感謝您的快速回復,因爲聽到這個錯誤令人失望。我會嘗試你的解決方法。 – msender

+0

@Remou:當我回答那個問題時,我做了一些測試,有兩個表格,行數很少,每行2或3個。具有「ON a.id = b.id或a.x IS NULL」或類似條件的查詢產生了非常奇怪的結果。 –

相關問題