在底部更新。
我正在尝试进行自我外连接,对于每个记录,返回它以及晚于它的所有其他记录,如果它本身是最新记录则返回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本身,我的查询返回了所需的结果。奇怪的。我也对类似的表进行了类似的查询,从一开始就有效,所以看来这是一个仅限于这一个表的问题。
答案 0 :(得分:2)
你没有遗漏任何东西。 如果发生这种情况,那就是一个错误。
MS-Access使用的引擎有几个错误。我已经在具有“复杂”ON
条件的连接中看到类似的,不完整的行为。请参阅另一个SO问题,其中Access提供错误结果: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
) ;