Access SQL左连接替代方案

Access SQL左连接替代方案,sql,ms-access,left-join,Sql,Ms Access,Left Join,我正在尝试使用左连接通过SQL访问,但它似乎不起作用。Access不断生成错误“不支持联接表达式” 我想做的事情如下。我有一张有工作卡的桌子和另一张有费用的桌子,如下所示 JOBCARDS ID JOBNAME 1 Job one 2 Job two 3 Job three COSTS ID TYPE COST JOB 1 PART 15.01 1 2 LABOUR 20.00 1 3 LABOUR 40

我正在尝试使用左连接通过SQL访问,但它似乎不起作用。Access不断生成错误“不支持联接表达式”

我想做的事情如下。我有一张有工作卡的桌子和另一张有费用的桌子,如下所示

JOBCARDS
ID    JOBNAME
1     Job one
2     Job two
3     Job three

COSTS
ID    TYPE    COST    JOB
1     PART    15.01   1
2     LABOUR  20.00   1
3     LABOUR  40.00   2
4     PART    34.54   3
5     PART    84.67   3
我正在尝试制定一个SQL查询,该查询将给出以下结果:

QUERY
ID    JOBNAME    PARTS    LABOUR
1     Job one    15.01    20.00
2     Job two    0.00     40.00
3     Job three  119.21   0.00
我想到的是:

SELECT
    CARDS.[ID] AS [ID],
    CARDS.[JOBNAME] AS [JOBNAME],
    SUM (COSTS1.[COST]) AS [PARTS],
    SUM (COSTS2.[COST]) AS [LABOUR]
FROM
    (([JOBCARDS] CARDS LEFT JOIN [COSTS] COSTS1 ON COSTS1.[JOB]=CARDS.[ID] AND COSTS1.[TYPE]='PART')
    LEFT JOIN [COSTS] COSTS2 ON COSTS2.[JOB]=CARDS.[ID] AND COSTS2.[TYPE]='LABOUR')
GROUP BY
    CARDS.[ID], CARDS.[JOBNAME];
Access似乎在部件“COSTS1.[TYPE]=“part”方面存在问题

有没有什么方法可以不使用左连接就完成我想做的事情?
或者有人发现了错误吗?

此SQL将给出结果。
0值将为空,但您可以使用
NZ
将其替换为0

SELECT      JobCards.ID
            ,JobName
            ,SUM(C2.Cost) AS Parts
            ,SUM(C1.Cost) AS Labour
FROM        (JobCards LEFT JOIN Costs C1 ON (JobCards.ID = C1.Job AND C1.Type = 'Labour'))
                      LEFT JOIN Costs C2 ON (JobCards.ID = C2.Job AND C2.Type = 'Part')
GROUP BY    JobCards.ID
            ,JobName
编辑: 重新阅读SQL-您只是忘记在Join中的ON语句后面加括号:
(COSTS1.[JOB]=卡片。[ID]和COSTS1.[TYPE]='PART')


编辑2:无需在所有内容周围加括号,或在字段名称与源字段相同的情况下使用别名,或在
选择
&
WHERE
子句中使用表名,除非字段名称出现在多个表中。

下面是一个相关子查询示例:

SELECT JOBCARDS.ID, 
       JOBCARDS.JOBNAME, 
       (SELECT SUM([COST]) FROM COSTS WHERE COSTS.JOB = JOBCARDS.ID AND COSTS.TYPE = 'PART') AS PARTS, 
       (SELECT SUM([COST]) FROM COSTS WHERE COSTS.JOB = JOBCARDS.ID AND COSTS.TYPE = 'LABOUR') AS LABOUR
FROM JOBCARDS;

相关子查询。我将仅在作业ID上联接这两个表,并对列使用iif语句,类似于“Part cost:iif(type=“Part”,cost,0)”和“Labour cost:iif(type=“Labour”,cost,0)”尝试从
中删除括号(([JOBCARDS]CARDS LEFT join[COSTS]COSTS1 on COSTS1.[job]=CARDS.[ID]和COSTS1.[type]='Part'))LEFT JOIN[COSTS]COSTS2 ON COSTS2.[JOB]=CARDS.[ID]和COSTS2.[TYPE]='LABOUR')
在我看来,第二个联接在声明CARDS别名的括号上下文之外?也许这对访问是有效的,但对meHi ADyson来说并不合适。从我在Access中看到的情况来看,这些括号似乎是必需的,否则JOIN子句将不被接受,并将生成一个错误。我现在感觉非常愚蠢。我花了几个小时试图让查询工作,这一切都归结为我遗漏了几个括号!现在我想知道哪种解决方案是“最好的”?使用IIF()、相关子查询还是我的原始想法?
SELECT JOBCARDS.ID, 
       JOBCARDS.JOBNAME, 
       (SELECT SUM([COST]) FROM COSTS WHERE COSTS.JOB = JOBCARDS.ID AND COSTS.TYPE = 'PART') AS PARTS, 
       (SELECT SUM([COST]) FROM COSTS WHERE COSTS.JOB = JOBCARDS.ID AND COSTS.TYPE = 'LABOUR') AS LABOUR
FROM JOBCARDS;