【问题标题】:Left join error - JOIN operation左连接错误 - JOIN 操作
【发布时间】:2017-08-30 09:59:01
【问题描述】:

我正在处理MS-ACESS 2016,对不同的表进行查询。

这个查询有问题,错误是:

JOIN 操作语法错误

查询:

SELECT  r.data                                                      AS data,
        r.cod_treb                                                  AS codi_treballador,
        r.cod_proj                                                  AS codi_projecte,
        r.hores                                                     AS hores_reunions, 
        Nz(ts.hores, 0)                                             AS hores_ts, 
        Iif(r.hores - hores_ts > 0, r.hores - Nz(ts.hores, 0), 0)   AS r_no_fetes 
FROM    reunions r 
        LEFT JOIN   (SELECT tl.*, j.cod_proj, ts.nom_treb, ts.acronim
                    FROM ((((timesheet_lines tl 
                    LEFT JOIN timesheets AS t
                        ON tl.timesheet_id = t.id)
                    LEFT JOIN justificacions AS j 
                        ON t.id_justificacio = j.id)
                    LEFT JOIN treballadors AS tw
                        ON r.cod_treb = tw.cod_treb)
                    LEFT JOIN projectes AS p
                        ON r.cod_proj = p.cod_proj))  AS ts
        ON r.cod_proj = ts.cod_proj
        AND r.cod_treb = ts.cod_treb  
        AND r.data = ts.data
        AND r.cod_treb = ts.cod_treb
        AND r.cod_proj = ts.cod_proj;

如果我尝试运行子查询(同样的错误)

SELECT tl.*, j.cod_proj, ts.nom_treb, ts.acronim
FROM ((((timesheet_lines tl, reunions r 
    LEFT JOIN timesheets AS t
        ON tl.timesheet_id = t.id)
    LEFT JOIN justificacions AS j 
        ON t.id_justificacio = j.id)
    LEFT JOIN treballadors AS tw
        ON r.cod_treb = tw.cod_treb)
    LEFT JOIN projectes AS p
        ON r.cod_proj = p.cod_proj)  AS ts
    WHERE r.cod_proj = ts.cod_proj
    AND r.cod_treb = ts.cod_treb  
    AND r.data = ts.data
    AND r.cod_treb = ts.cod_treb
    AND r.cod_proj = ts.cod_proj;

谢谢。

【问题讨论】:

  • 你不应该用那么多括号
  • FROM(timesheet_lines AS tl 开头的括号可能会在此处使用扳手
  • 例如这里( r.cod_proj = ts.cod_proj )括号是无用的,当然对于每个比较
  • @Jens 我编辑了查询,但出现了新错误
  • Multiple INNER JOIN SQL ACCESS 的可能重复项——您的子查询中的 JOIN 需要更多括号。

标签: sql database ms-access left-join


【解决方案1】:

可能不是答案,但我太新了,无法发表评论。看起来代码被视为两条语句,错误中引用的后半部分不完整且未执行。如果那是真的,就不可能用帖子上的格式来说明原因。

另外,这可能是我的无知,但我从未见过 SQL 语句读取 JOIN tbl1 on tbl2 on tbl3。是否可能需要 JOIN tbl1 on tbl2 JOIN tbl1 on tbl3 而第二个连接是缺少的运算符?

【讨论】:

  • 第一个连接将 ts (这是所有其余连接的结果)连接到表 1。这就是我做 LEFT JOIN (LEFT,LEFT,LEFT) 的原因AS ts ON xxx
  • 不要发表评论作为答案。如果你不能评论,请不要评论。不过,这确实试图回答。 (很糟糕。)
【解决方案2】:

您的子查询必须有额外的括号:

(SELECT tl.*, j.cod_proj, t.nom_treb, p.acronim
FROM (((timesheet_lines tl 
LEFT JOIN timesheets AS t 
ON tl.timesheet_id = t.id)
LEFT JOIN justificacions AS j 
ON t.id_justificacio = j.id)
LEFT JOIN treballadors AS t
ON r.cod_treb = t.cod_treb)
LEFT JOIN projectes AS p
ON r.cod_proj = p.cod_proj)  AS ts

【讨论】:

  • 我正在这样做,即使我尝试使用更多括号,因为最后一个括号关闭了 SELECT 语句而不是 FROM。它在 JOIN clausule 中给了我错误,更新了主帖,谢谢。
  • 第 4 对不需要但不会造成伤害。您是否尝试过单独运行子查询ts?分而治之。 @bimmer55
  • 它仍然无法正常工作并给出同样的错误,这让我发疯
  • 由于一些小错误,我更新了主查询并添加了我正在尝试运行的子查询。
【解决方案3】:

我使用 ACCESS 2016 的设计模式让它工作,查询现在可以工作,看起来像这样:

SELECT r.data, 
       r.cod_treb, 
       r.cod_proj, 
       r.hores                                                   AS 
       hores_reunions, 
       Nz(ts.hores, 0)                                           AS hores_ts, 
       Iif(r.hores - hores_ts > 0, r.hores - Nz(ts.hores, 0), 0) AS r_no_fetes, 
       treballadors.nom_treb, 
       projectes.acronim 
FROM   ((reunions AS r 
         LEFT JOIN (SELECT tl.*, 
                           j.cod_proj 
                    FROM   (timesheet_lines AS tl 
                            LEFT JOIN timesheets AS t 
                                   ON tl.timesheet_id = t.id) 
                           LEFT JOIN justificacions AS j 
                                  ON j.id = t.id_justificacio) AS ts 
                ON ( r.cod_proj = ts.cod_proj ) 
                   AND ( r.cod_treb = ts.cod_treb ) 
                   AND ( r.data = ts.data )) 
        INNER JOIN projectes 
                ON r.cod_proj = projectes.cod_proj) 
       INNER JOIN treballadors 
               ON r.cod_treb = treballadors.cod_treb; 

【讨论】:

    【解决方案4】:

    阅读后你有以下问题:

    FROM reunions AS r AS 错误。

    FROM(tenter code hereimesheet_lines AS tl 应该是FROM timesheet_lines tl

    ON j.id = t.id_justificacio) AS ts 应该是ON j.id = t.id_justificacio

    我希望这是正确的,因为这两个 ( 和 ) 没有意义。

    编辑: 根据我的 Access 2010 这没关系,因为加入错误消失了,它说,找不到表 x:

    SELECT  r.data                                                      AS data,
            r.cod_treb                                                  AS codi_treballador,
            r.cod_proj                                                  AS codi_projecte,
            r.hores                                                     AS hores_reunions, 
            Nz(ts.hores, 0)                                             AS hores_ts, 
            Iif(r.hores - hores_ts > 0, r.hores - Nz(ts.hores, 0), 0)   AS r_no_fetes 
    FROM    reunions r 
            LEFT JOIN   (SELECT tl.*, j.cod_proj, tw.nom_treb, p.acronim
                        FROM timesheet_lines tl 
                        LEFT JOIN timesheets AS t
                            ON tl.timesheet_id = t.id
                        LEFT JOIN justificacions AS j 
                            ON t.id_justificacio = j.id
                        LEFT JOIN treballadors AS tw
                            ON r.cod_treb = tw.cod_treb
                        LEFT JOIN projectes AS p
                            ON r.cod_proj = p.cod_proj)  AS ts
            ON r.cod_proj = ts.cod_proj
            AND r.cod_treb = ts.cod_treb  
            AND r.data = ts.data
            AND r.cod_treb = ts.nom_treb
            AND r.cod_proj = ts.cod_proj;
    

    【讨论】:

    • 我按照你说的做了,我也改变了顺序,我认为现在是正确的,但它给了我新的错误。我更新了主帖
    • 好的。这次我看到以下内容。你有两次相同的别名:LEFT JOIN timesheets AS tLEFT JOIN treballadors AS t
    • 哦,我没看到,但无论如何它并没有解决问题:(
    • 阅读其他 cmets(谢谢大家)你应该添加括号,另外你应该只 SELECT 你需要的列,然后你可以删除 tl.*。我从其他数据库中知道,子查询中的通配符可能是个问题。
    • 删除通配符什么都不做,其他事情已经完成,目前我的查询就像在主帖中一样。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多