在底部更新。
我正在尝试做一个自我外连接,对于每条记录,返回它和所有其他在它之后发生的记录,或者如果它本身是最新的记录,则返回 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 本身,我的查询返回了所需的结果。奇怪的。我也对一个从一开始就有效的类似表进行了类似的查询,所以这似乎是一个仅限于这个表的问题。