sql - Access SQL LEFT JOIN 替代方案

标签 sql ms-access left-join

我正在尝试使用 LEFT JOIN 在 Access via SQL 中执行某些操作,但它似乎不起作用。 Access 不断生成错误“不支持 JOIN 表达式。”。

我想要完成的任务如下。我有一张 table ,上面有工作卡,另一张 table 的费用如下。

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'”部分有问题。

有什么方法可以在不使用 LEFT JOIN 的情况下完成我想要做的事情吗? 或者有人发现错误了吗?

最佳答案

此 SQL 将给出结果。
0 值将为 Null,但您可以使用 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]=CARDS.[ID] AND COSTS1.[TYPE]='PART')

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];

编辑 2:无需将所有内容括起来,也不需要为字段名称添加别名(如果它们与源字段相同),或者在 SELECT< 中使用表名称 & WHERE 子句,除非字段名称出现在多个表中。

关于sql - Access SQL LEFT JOIN 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38897998/

相关文章:

php - 从类别中选择最新主题(SQL 和 PHP)

sql - 在不触发唯一键冲突的情况下更新主键

join - 谓词下推与 On 子句

MYSQL:左连接仅第一行或选择不同

javascript - 在 PHP 中执行指定时间范围内的操作

java - 从 NetBeans 插入 Access 数据库

ms-access - accdb 与 mdb。哪个更快/更好?

java - 应用程序不会写入 MS DB

mysql - MySQL为什么不对JOIN加ORDER使用主键?

sql - DRY - 如何将重复代码提取到...存储函数?