6

在底部更新。

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

4

1 回答 1

2

你没有错过任何东西。如果发生这种情况,这是一个错误。

MS-Access 使用的引擎有几个错误。我在具有“复杂”ON条件的连接中看到了类似的、无效的行为。请参阅 Access 给出错误结果的另一个 SO 问题:为什么我在 Access 中的左联接的行数少于左表?

您可以在 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
      ) ;
于 2012-09-24T22:12:26.870 回答