0

私はこのようなクエリを持っています:

SELECT a.title,
       a.spec,
       a.name,
       l.User AS CreatedBy,
       DateAdd ( "s", l.time, #03/01/1980# ) AS CreatedAt
FROM 
    (Reports AS a
      INNER JOIN
        AuditLog AS l ON a.id = l.id)
      INNER JOIN
        (SELECT min([time]) AS Mintime,
         id FROM AuditLog GROUP BY id)
        AS t ON (l.time = t.mintime)
      AND (l.id = t.id)
WHERE (((a.ACTIVE)='Y'));

テーブルReportsには15000レコードがあり、AuditLogには25800があります。ただし、このクエリは7800の結果しか返しません。さらに多くの結果が返されると思いました(レポートの作成時に監査が生成されるため、すべてのレポートに一致する監査があると想定されます)。

レコード数など、不足しているものを調査するために作成できる新しいクエリにはどのようなものがありますか?このクエリをコピーしてOUTERJOINを使用してみましたが、「JOIN操作の構文エラー」が発生しました。ほとんどがアクティブであるため、WHERE句を削除しても問題はありません。

4

2 に答える 2

1

の使用例を次に示しLeft Joinます。これにより、AuditLogテーブルに一致するものがあるかどうかに関係なく、レポートのすべてのレコードが表示されます。

Select
  a.title, 
  a.spec, 
  a.name, 
  l.User AS CreatedBy, 
  IIf(IsNull(l.Time), Null, DateAdd ( "s", l.time, #03/01/1980# )) AS CreatedAt
From (
  Reports As a 
    Left Join
  AuditLog AS l 
    On a.id = l.id
  ) Left Join (
    Select
      Min([time]) AS Mintime, 
      id
    From 
      AuditLog 
    Group By
      id
  )  AS t ON (l.id = t.id) AND (l.time = t.mintime)
Where
  a.Active = 'Y';

これが私のテストデータベースのデータベースドキュメンテーション機能からの抜粋です:

Table: AuditLog                                             

     Name      Type          Size
     ID        Long Integer  4
     Time      Long Integer  4
     User      Text          255

Table: Reports

     Name      Type          Size
     ID        Long Integer  4
     Title     Text          255
     Spec      Text          255
     Name      Text          255
     Active    Text          255

Query: Test

SQL

     SELECT a.title, a.spec, a.name, l.User AS CreatedBy, DateAdd ( "s", l.time,
     #03/01/1980# ) AS CreatedAt
     FROM (Reports AS a LEFT JOIN AuditLog AS l ON a.id = l.id) LEFT JOIN (SELECT
      Min([time]) AS Mintime, id FROM AuditLog GROUP BY id)  AS t ON (l.id = t.id)
     AND (l.time = t.mintime)
     WHERE a.Active = 'Y'

Columns

     Name      Type          Size
     title     Text          255
     spec      Text          255
     name      Text          255
     CreatedBy Text          255
     CreatedAt Date/Time     8

Accessがさらにいくつかの括弧を追加していることに気付きました。また、ドキュメンターは何らかの理由でwhere句を見逃していました。クエリ定義にあります。

于 2012-12-31T21:32:24.573 に答える
1

レコード数など、不足しているものを調査するために作成できる新しいクエリは何ですか?

Reportsクエリ結果セットに何行あると思いますか?一意の行ごとに1行にする必要がある場合Reports.idは、このクエリから何が得られるかを確認することから始めます。

SELECT r.id, Count(*) AS num_matches
FROM [Reports] AS r
WHERE r.ACTIVE='Y'
GROUP BY r.id;

サブクエリの結果セットを個別に調べることも役立つ場合があります。

SELECT id, Min([time]) AS Mintime, Count(*) AS num_rows
FROM AuditLog
GROUP BY id;

これらの提案を超えて、SQLから意図した目標を推測しようとして迷子になりました。LEFT JOINただし、の代わりにに切り替えると、このフィールド式に問題が発生する可能性があることを警告したいと思いますINNER JOIN

DateAdd("s", l.time, #03/01/1980#) AS CreatedAt

を使用すると、。LEFT JOINの行がNullになる場合がありますl.time。次の式は、「Nullの無効な使用」をスローします。

DateAdd("s", Null, #03/01/1980#)

その問題が発生している場合は、DateAdd式をサブクエリに移動して、Null以外の値のみが供給されるようにします。または、式DateAddの内部を使用して、IIf()式をNullから保護します。

IIf([time] Is Null, Null, DateAdd("s", [time], #03/01/1980#)) AS CreatedAt
于 2013-01-01T16:10:55.837 に答える