更新在底部。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本身我的查詢返回所需的結果。奇怪的。我也有類似的查詢,從一開始就工作的類似的表,所以看起來這是一個限於這個表的問題。
哪些DBMS您使用的?訪問? –
那麼這讓我撓我的頭 –
在MS Access 2010中運行您的查詢我得到您的預期結果。 – Fionnuala