Access SQL左连接替代方案
我正在尝试使用左连接通过SQL访问,但它似乎不起作用。Access不断生成错误“不支持联接表达式” 我想做的事情如下。我有一张有工作卡的桌子和另一张有费用的桌子,如下所示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
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;