Sql 外部联接结果缺少行,没有WHERE子句(找到解决方法)

Sql 外部联接结果缺少行,没有WHERE子句(找到解决方法),sql,ms-access-2007,Sql,Ms Access 2007,在底部更新 我正在尝试做一个自-外联接,对于每个记录,它返回它和它之后出现的所有其他记录,如果它本身是最新的记录,则返回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.R

在底部更新

我正在尝试做一个自-外联接,对于每个记录,它返回它和它之后出现的所有其他记录,如果它本身是最新的记录,则返回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
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
假设我的查询是一个左外部联接,并且没有WHERE子句,我希望原始表中的所有行都在结果中,但事实并非如此。我错过了什么

编辑:这是在Access 2007中

更新:我决定看看如果我将表CR_uadmin\u REGIS_状态的部分复制到一个单独的表中并针对该表运行查询,将会发生什么情况。即使我刚刚直接将整个表手动复制到新表中,查询仍然有效!但这只是在实际复制和粘贴时的情况,当我选择*到另一个表中时,问题仍然存在。 最终我发现,如果我对

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

我的查询返回了所需的结果,而不是CR\u ADMIN\u REGIS_状态本身。奇怪的我还对一个从一开始就工作的类似表进行了类似的查询,因此这似乎是一个仅限于这一个表的问题。

您没有遗漏任何内容。如果发生这种情况,那是个bug

MS Access使用的引擎有几个错误。我在具有复杂ON条件的联接中看到过类似的、不真实的行为。请参见另一个这样的问题,访问在哪里会产生buggy结果:

您可以在SQL Server、Oracle、Postgres甚至MySQL中尝试使用相同的数据进行查询,您将得到正确的预期结果

作为一种解决方法,您可以尝试使用联合重写查询,但无法确定其正确性:

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
      ) ;

在MS Access 2010中运行您的查询,我得到了您的预期结果。我在MS Access中得到了预期结果。感谢您的快速回答,尽管听到这个错误令人失望。“我会试试你的变通方法。”雷莫:当我回答另一个问题时,我做了一些测试,有两个表和很少的行,每个2或3行。对a.id=b.id或a.x的查询为NULL或类似条件产生了非常奇怪的结果。@Remou:我也在2007版本中进行了测试。但这种情况似乎比另一种情况更正常和普遍。我对这个bug感到相当惊讶,但这更令人惊讶,因为其中没有空值。
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
      ) ;