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

クエリがLEFTOUTERJOINであり、WHERE句がない場合、元のテーブルのすべての行が結果に含まれると予想されますが、そうではありません。ここで何が欠けていますか?

編集:これはAccess2007にあります

更新:テーブル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自体ではなく、クエリが目的の結果を返しました。変。最初から機能していた同様のテーブルに対しても同様のクエリがあったので、これはこの1つのテーブルに限定された問題だったようです。

4

1 に答える 1

2

あなたは何も見逃していません。これが発生した場合、それはバグです。

MS-Access で使用されるエンジンにはいくつかのバグがあります。「複雑な」ON条件を持つ結合で、同様の無効な動作を見てきました。Access でバグのある結果が得られる別の SO の質問を参照してください。

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 に答える