0

Access に次の SQL クエリがありますが、これは正常に動作します。

SELECT TableA.FieldA As [Code],
   Count(TableA.FieldC) AS [Count]
FROM ((MainTable)
   LEFT JOIN TableA ON MainTable.FieldB = TableA.FieldB)
WHERE (((MainTable.DateOf)>=#1/1/2012#))
   AND Clng(TableA.FieldA) >= 119593451
   AND Clng(TableA.FieldA) <= 119593461
GROUP BY TableA.FieldA;

しかし、別の左結合を試みると、次のようになります。

SELECT TableA.FieldA As [Code],
   Count(TableA.FieldC) AS [Count]
FROM ((MainTable)
   LEFT JOIN TableA ON MainTable.FieldB = TableA.FieldB)
   LEFT JOIN TableB ON TableA.FieldD = TableB.FieldD
WHERE (((MainTable.DateOf)>=#1/1/2012#))
   AND Clng(TableA.FieldA) >= 119593451
   AND Clng(TableA.FieldA) <= 119593461
GROUP BY TableA.FieldA;

これに基づいて FROM 句で括弧を使用しています: http://nm1m.blogspot.com/2007/10/multiple-left-joins-in-ms-access.html

nullチェックInvalid use of Nullなどを実行していないため、意味がありません。ここでの問題は何ですか? TableB のフィールドをプルして表示しようとしています (ただし、まだ選択セクションには入れていません)。

4

1 に答える 1

5

Access は括弧が好きです。結合の周りに括弧を追加します。

CLng関数には null 以外の値が必要です。これは で修正できますCLng(Nz(TableA.FieldA, "0")) >= 119593451。ただし、フィールドが数値の場合、一体なぜそもそもテキストにするのでしょうか? これは深刻な問題であり、データ型を数値型に変更することで (可能であれば) すぐに修正することを強くお勧めします。

しかし、別の問題があります。クエリで行っているように、句に条件を入れてLEFT JOINも、テーブルには意味がありません! WHEREに変更するINNER JOINか、条件TableAを のON句に入れますLEFT JOIN。Access でこの構文が許可されない場合は、派生テーブルに変更します。

SELECT
   TableA.FieldA As [Code],
   Count(TableA.FieldC) AS [Count]
FROM
   (
      (
         (MainTable)
         LEFT JOIN (
            SELECT * FROM TableA
            WHERE
               Clng(Nz(TableA.FieldA, "0")) >= 119593451
               AND Clng(Nz(TableA.FieldA, "0")) <= 119593461
         ) TableA ON MainTable.FieldB = TableA.FieldB
      )
      LEFT JOIN TableB ON TableA.FieldD = TableB.FieldD
   )
WHERE (((MainTable.DateOf)>=#1/1/2012#))
GROUP BY TableA.FieldA;

注: 追加WHERE TableA.FieldA IS NOT NULLは機能する場合がありますが、機能しない場合があります。Access では 100% 安全ですが、SQL Server でのそのようなクエリは、適用される条件の順序が保証されていないため、安全ではありません。明らかに、SQL Server では、NULL で関数がない場合でも整数に変換できますが、ポイントは依然として有効です。無効な型変換から保護するCLngために、想像上の条件の順序に頼る習慣を身につけないでください。代わりに、WHEREエラーの可能性がある式内の無効な型変換を処理する必要があります。これがベスト プラクティスです。

于 2012-12-21T19:43:08.217 に答える