【问题标题】:the specified field Could refer to more than one table listed in FROM clause指定的字段可以引用 FROM 子句中列出的多个表
【发布时间】:2012-08-13 08:41:38
【问题描述】:

我有以下代码。我的问题是我想从另一个表名 Employee 中检索每个员工姓名,该表名 Employee 的 EmployeeID 列类似于我在当前查询中使用的 AccessLog 表。现在,当我加入这两个表时,它给出了我在标题上所说的那个奇怪的错误。在第一个 SELECT 和作为 A.EmployeeID= Employee.EmployeeID 到最后一个 ORDER By 子句的 INNER JOIN Employee,它运行良好。我认为问题在于命名/别名。我看到了类似的线程,但那些并没有解决我的问题。如果有人能指出我的错,将不胜感激。

SELECT **A.EmployeeID,
    Employee.FirstName,**
    MonthName(Month([LogDate])) AS MonthName,
    Round((Sum(Int(DateDiff("s",'00:00:00',Duration)))/3600)) AS TotalTime
    FROM (
         SELECT AccessLog.EmployeeID, 
                AccessLog.LogDate, 
                AccessLog.TerminalID, 
                AccessLog.LogTime, 
                Format((SELECT max(LogTime) 
                        FROM AccessLog AS Alias 
                        WHERE Alias.LogTime < AccessLog.LogTime 
                        AND Alias.EmployeeID = AccessLog.EmployeeID 
                        AND Alias.LogDate = AccessLog.LogDate 
                        AND (Alias.TerminalID)<>"iGuard1A" 
                        And (Alias.TerminalID)<>"iGuard1B"  
                        AND Alias.EmployeeID = AccessLog.EmployeeID),"hh:nn:ss") AS PrevTime, 
                Format((ElapsedTime(iif(PrevTime = '',logtime,prevtime),[LogTime])),"hh:nn:ss") AS Duration, 
                AccessLog.InOut 
             FROM AccessLog 
             WHERE (((AccessLog.TerminalID)<>"iGuard1A" 
             And (AccessLog.TerminalID)<>"iGuard1B") 
             AND ((AccessLog.EmployeeID) Like "2*") 
             AND ((AccessLog.InOut)="OUT")) 
             ORDER BY AccessLog.EmployeeID, AccessLog.LogDate, AccessLog.LogTime)  
             **AS A INNER JOIN Employee ON A.EmployeeID= Employee.EmployeeID**
      GROUP BY EmployeeID, MonthName(Month([LogDate]));

【问题讨论】:

    标签: sql ms-access join


    【解决方案1】:

    我认为它可能是 GROUP BY EmployeeId - 尝试将其更改为 GROUP BY A.EmployeeIdGROUP BY Employee.EmployeeId

    编辑:它可能必须是 GROUP BY A.EmployeeId,因为那是使用 SELECT 的那个。

    【讨论】:

    • 这给了我一个新的错误——“你试图执行一个不包含指定表达式'firstname'作为聚合函数的查询”
    • 啊,因为您正在对持续时间求和,所以 SELECT 语句中的所有其他内容都需要在聚合函数中,或者在 GROUP BY 子句中。将 Employee.FirstName 添加到 GROUP BY 子句将是解决它的快速/简单的方法,但它可能会产生意想不到的副作用。如果是这样,您可能需要重构查询。
    • 是的,这给了我数据类型不匹配的错误。不知道怎么解决,这个领域的新手。
    • 您可以发布 AccessLog 和 Employee 的架构吗?
    • 我尝试上传编辑帖子并包含架构 jpg。但似乎我无法上传图片,因为我没有那么大的声誉。知道如何向您展示该图像。
    【解决方案2】:

    我解决了。正如我所说,存在名称/别名问题。我必须为每个子查询中使用的同一个表提供单独的别名。即使在那之后它显示了顶部选择中名字的另一个聚合函数错误,我也通过将它包含在子查询中解决了这个问题。所以我的代码如下:

    SELECT C.EmployeeID, 
       (SELECT Employee.FirstName& ' ' &Employee.LastName 
          FROM Employee 
          where C.EmployeeID= Employee.EmployeeID) 
        AS FullName, 
       MonthName(Month([LogDate])) AS MonthName,
       Round((Sum(Int(DateDiff("s",'00:00:00',Duration)))/3600)) AS TotalTime
       FROM (SELECT B.EmployeeID, 
                  B.LogDate, 
                  B.TerminalID, 
                  B.LogTime, 
                  Format((SELECT max(LogTime) 
                          FROM AccessLog AS A 
                          WHERE A.LogTime < B.LogTime 
                          AND A.EmployeeID = B.EmployeeID  
                          AND A.LogDate = B.LogDate 
                          AND (A.TerminalID)<>"iGuard1A" 
                          And (A.TerminalID)<>"iGuard1B"  
                          AND A.EmployeeID = B.EmployeeID),"hh:nn:ss") AS PrevTime,  
                  Format((ElapsedTime(iif(PrevTime = '',logtime,prevtime),[LogTime])),"hh:nn:ss") AS Duration, 
                  B.InOut 
                  FROM AccessLog As B  
                  WHERE (((B.TerminalID)<>"iGuard1A" 
                   And (B.TerminalID)<>"iGuard1B") 
                   AND ((B.EmployeeID) Like "2*") 
                   AND ((B.InOut)="OUT")) 
                   ORDER BY B.EmployeeID, B.LogDate, B.LogTime)  
    AS C INNER JOIN Employee ON C.EmployeeID= Employee.EmployeeID
    GROUP BY C.EmployeeID, MonthName(Month([LogDate]));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      相关资源
      最近更新 更多