【问题标题】:Access SQL LEFT JOIN alternative访问 SQL LEFT JOIN 替代方案
【发布时间】:2016-08-11 13:38:49
【问题描述】:

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

我要完成的工作如下。我有一张有工作卡的桌子和另一张桌子,费用如下。

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

“COSTS1.[TYPE]='PART'”部分的访问似乎有问题。

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

【问题讨论】:

  • 相关子查询。
  • 我将仅在作业 ID 上加入 2 个表,并对列使用 iif 语句,例如“Part cost:iif(type="part",cost,0)”和“人工成本:iif(type="Labour",cost,0)"
  • 尝试从(([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') 中删除括号在我看来,第二个连接在声明CARDS 别名的括号上下文之外?也许这对 Access 有效,但我觉得它不正确
  • 嗨阿迪森。从我在 Access 中看到的情况来看,这些括号似乎是必需的,否则将不接受 JOIN 子句并生成错误。

标签: sql ms-access left-join


【解决方案1】:

此 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 和 @ 中的表名称987654326@ 子句,除非字段名称出现在多个表中。

【讨论】:

  • 我现在觉得自己很蠢。我花了几个小时试图让查询工作,这一切都归结为我缺少几个括号!
【解决方案2】:

这是一个相关的子查询示例:

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;

【讨论】:

  • 现在我想知道哪个解决方案是“最好的”?使用 IIF()、相关子查询还是我最初的想法?
猜你喜欢
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多