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 个结果,我想还会有更多(创建报告时会生成审计,因此假设每个报告都有匹配的审计)。

我可以进行哪些新查询来研究缺失的内容,例如记录计数等?我确实尝试复制此查询并使用 OUTER JOIN,但它给了我“JOIN 操作中的语法错误”。大多数都是活动的,因此删除 WHERE 子句不是原因。

4

2 回答 2

1

我可以提出哪些新的查询来研究缺失的内容,例如记录计数等?

您期望查询结果集中有多少行Reports?如果每个 unique 应该是一行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

使用 a LEFT JOIN,您可能会有带有 Null 的行l.time。以下表达式抛出“无效使用 Null”。

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

如果您遇到该问题,请将DateAdd表达式移动到子查询中,以确保它仅提供非 Null 值。或者在表达式DateAdd内部使用IIf()以保护它免受 Nulls 的影响。

IIf([time] Is Null, Null, DateAdd("s", [time], #03/01/1980#)) AS CreatedAt
于 2013-01-01T16:10:55.837 回答
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 回答