带有左连接语法错误的SQL子查询

sta*_*nge 5 sql ms-access jet subquery left-join

我有一个查询我试图运行但是我在运行时遇到语法错误.以下是给我错误的查询:

SELECT A.*, B.Total AS Assigned
FROM (
    SELECT tblSkillSets.employeeName AS Employee, tblEvents.eventName AS Event, tblProcesses.ID AS Process, tblProcesses.Priority.Value AS       Priority, tblProcesses.minutesPerItem AS Minutes
    FROM tblEvents INNER JOIN (tblSkillSets INNER JOIN tblProcesses ON tblSkillSets.eventName = tblProcesses.eventName.Value) ON tblEvents.ID = tblSkillSets.eventName
    WHERE tblProcesses.ID=27
) AS A
LEFT JOIN 
(
    SELECT tblWorkflow.assignedTo AS Employee, Sum(IIf(DateDiff('d',[openedDate],Date())=0,[itemCount]*[minutesPerItem],0)) AS Total
    FROM tblProcesses RIGHT JOIN tblWorkflow ON tblProcesses.ID = tblWorkflow.processName
    WHERE tblWorkflow.processName=27 AND (tblWorkflow.Status=1 Or tblWorkflow.Status=2)
    GROUP BY tblWorkflow.assignedTo
) AS B 
ON A.Employee = B.Employee
ORDER BY B.Total, A.Employee
Run Code Online (Sandbox Code Playgroud)

关于这个奇怪的是,以下查询工作正常:

SELECT Query1.*, Query2.Total AS Assigned
FROM Query1 LEFT JOIN Query2 ON Query1.Employee = Query2.Employee
ORDER BY Query2.Total, Query1.Employee
Run Code Online (Sandbox Code Playgroud)

Query1的位置是:

SELECT tblSkillSets.employeeName AS Employee, tblEvents.eventName AS Event, tblProcesses.ID AS Process, tblProcesses.Priority.Value AS Priority, tblProcesses.minutesPerItem AS Minutes
FROM tblEvents INNER JOIN (tblSkillSets INNER JOIN tblProcesses ON tblSkillSets.eventName = tblProcesses.eventName.Value) ON tblEvents.ID = tblSkillSets.eventName
WHERE tblProcesses.ID=27;
Run Code Online (Sandbox Code Playgroud)

和Query2是:

SELECT tblWorkflow.assignedTo AS Employee, Sum(IIf(DateDiff('d',[openedDate],Date())=0,[itemCount]*[minutesPerItem],0)) AS Total
FROM tblProcesses RIGHT JOIN tblWorkflow ON tblProcesses.ID = tblWorkflow.processName
WHERE tblWorkflow.processName=27 AND (tblWorkflow.Status=1 Or tblWorkflow.Status=2)
GROUP BY tblWorkflow.assignedTo;
Run Code Online (Sandbox Code Playgroud)

我所做的就是使用构成Query1和Query2的代码并将它们用作子查询,但是在运行时它不起作用.

**编辑:

还有一件事是这个查询也有效:

SELECT A.*, Query2.Total AS Assigned
FROM (
    SELECT tblSkillSets.employeeName AS Employee, tblEvents.eventName AS Event, tblProcesses.ID AS Process, tblProcesses.Priority.Value AS Priority, tblProcesses.minutesPerItem AS Minutes
    FROM tblEvents INNER JOIN (tblSkillSets INNER JOIN tblProcesses ON tblSkillSets.eventName = tblProcesses.eventName.Value) ON tblEvents.ID = tblSkillSets.eventName
    WHERE tblProcesses.ID=27
) AS A
LEFT JOIN Query2 
ON A.Employee = Query2.assignedTo
ORDER BY Query2.Total, A.Employee
Run Code Online (Sandbox Code Playgroud)

这让我觉得错误与子查询的左连接或第二个查询本身有关.虽然不太确定.

我得到的确切错误是:查询中的语法错误.不完整的查询条款.

以下是表格:

tblEvents

ID  eventName                eventAbbr  deskName    Notes 
1   Partial Call             PC         Redemption   
2   Full Call                FC         Redemption   
3   Maturity                 MAT        Redemption   
4   UIT Final Payment        UFNL       Redemption   
5   Prerefunding/Defeasement PRF/DEF    Redemption   
6   UIT Distribution         UIT        Dividend     
7   Equity Distribution      EQTY       Dividend
Run Code Online (Sandbox Code Playgroud)

tblProcesses

ID  processName             processAbbr     eventName                               minutesPerItem Priority assignAll   dataSource      Notes
17  DRV Coding (Account)    DRVCDA          UIT Distribution                        0.025                   No          Document Direct 
18  DRV Buys                DMBUY           Equity Distribution                     0.35           !        Yes         Document Direct 
19  Liquidation Exceptions  LIQEXC          Equity Distribution                     0.085                   Yes         Document Direct 
20  CMV                     CMV             UIT Distribution, Equity Distribution   30                      No          BMC Jobs    
21  As of Trades            ASOFTR          UIT Distribution, Equity Distribution   5              !        No          Document Direct 
22  Dividend Exceptions     DVEXC           Equity Distribution                     1                       No          Document Direct 
23  DRV Buys (Previous Day) PRVBUY          Equity Distribution                     0.15                    Yes         Document Direct 
24  DRV Coding (Security)   DRVCDS          Equity Distribution                     10                      No          Document Direct 
25  Upcoming Elections      UPCMEL          Equity Distribution                     5              !        No          Document Direct 
26  Long Short              LNGSHRT         UIT Distribution, Equity Distribution   2                       No          SQL Server  
27  Sold Lottery Shares     SLDLTSH         Partial Call                            1                       No          Document Direct 
28  Upcoming Finals         UPCMFN          UIT Final Payment                       1              !        No          Document Direct 
29  Remove Inventory        RMVINV          UIT Final Payment                       0.5                     No          Document Direct 
Run Code Online (Sandbox Code Playgroud)

tblSkillSets

employeeName    deskName    eventName
300             Dividend    Equity Distribution
300             Dividend    UIT Distribution
305             Dividend    UIT Distribution
305             Dividend    Equity Distribution
342             Redemption  Full Call
342             Redemption  Maturity
342             Redemption  Partial Call
342             Redemption  UIT Final Payment
342             Redemption  Prerefunding/Defeasement
345             Redemption  Maturity
345             Redemption  Full Call
345             Redemption  UIT Final Payment
345             Redemption  Partial Call
345             Redemption  Prerefunding/Defeasement
346             Dividend    UIT Distribution
346             Dividend    Equity Distribution
348             Redemption  Partial Call
348             Redemption  Full Call
348             Redemption  Maturity
348             Redemption  UIT Final Payment
348             Redemption  Prerefunding/Defeasement
350             Dividend    UIT Distribution
350             Dividend    Equity Distribution
Run Code Online (Sandbox Code Playgroud)

tblWorkflow

ID      assignedTo  eventName   processName         itemCount   estimatedMinutes    Status  Priority    openedBy    openedDate
233382  348         Maturity    Maturity Exceptions 8           24                  3                   SYSTEM      1/9/2018 3:20:30 PM
233383  345         Maturity    Maturity Exceptions 8           24                  3                   SYSTEM      1/9/2018 3:20:30 PM
233384  342         Maturity    Maturity Exceptions 7           21                  3                   SYSTEM      1/9/2018 3:20:30 PM
Run Code Online (Sandbox Code Playgroud)

预期结果

在此输入图像描述

任何帮助表示赞赏,谢谢!

sta*_*nge 0

我明白为什么这不起作用了!虽然它没有解释为什么使用实际的查询对象(Query1 和 Query2)有效,但它解决了我的问题,所以我对此感到满意。

第二个子查询中的分组导致了该问题。我删除了第二个子查询中的分组,然后在最终查询中执行分组,这是两个子查询的聚合。以下是解决该问题的有效查询:

SELECT A.Employee, A.Event, A.Process, A.Priority, A.Minutes, Sum(B.Total) AS Assigned
FROM (
    SELECT tblSkillSets.employeeName AS Employee, tblSkillSets.eventName AS Event, tblProcesses.ID AS Process, tblProcesses.Priority.Value AS Priority, tblProcesses.minutesPerItem AS Minutes 
    FROM tblEvents INNER JOIN (tblSkillSets INNER JOIN tblProcesses ON tblSkillSets.eventName = tblProcesses.eventName.Value) ON tblEvents.ID = tblSkillSets.eventName 
    WHERE tblProcesses.ID=27
) AS A 
LEFT JOIN (
    SELECT tblWorkflow.assignedTo, [itemCount]*[minutesPerItem] AS Total
    FROM tblProcesses RIGHT JOIN tblWorkflow ON tblProcesses.ID = tblWorkflow.processName
    WHERE (tblWorkflow.Status=1 Or tblWorkflow.Status=2) 
    AND DateDiff('d',[openedDate],Date())=0
) AS B 
ON A.Employee = B.assignedTo
GROUP BY A.Employee, A.Event, A.Process, A.Priority, A.Minutes, A.Employee
ORDER BY Sum(B.Total), A.Employee;
Run Code Online (Sandbox Code Playgroud)

因此,基本上 Access 无法组合两个子查询,其中一个是聚合,另一个不是聚合。为了解决这个问题,使两个子查询都成为非聚合查询,将它们组合起来,并对最终查询执行聚合。