从三张桌子加入

时间:2016-11-11 08:25:29

标签: sql ms-access

我在数据库中有三个表(括号中我需要的列);

  • Alphadata(发票,DateRaised,金额,员工)

  • TL Auth(发票)

  • 代理商(团队负责人)

我目前正试图将所有这些列用于一个查询的代码是这样的;

SELECT Alphadata.Invoice, Alphadata.DateRaised, Alphadata.Amount, Alphadata.Staff, Agents.TeamLeader, TlAuth.Invoice

FROM Alphadata 

INNER JOIN TlAuth ON Alphadata.invoice = TlAuth.invoice

INNER JOIN Agents.Alphaname = Alphadata.Staff;

我想我错过了什么。但是当我删除代理(最后一行)时,我已经填充了AlphaData和TL Auth列,但第二次我重新添加它会出错。

3 个答案:

答案 0 :(得分:1)

您错过了表格的名称和ON这一行:

INNER JOIN Agents ON Agents.Alphaname = Alphadata.Staff;

答案 1 :(得分:0)

您错过了第二个和第三个表的连接条件。此外,如果使用表别名,则在编写SQL查询时会获得良好的里程。请注意,在下面的更正查询中,我在查询中将三个表别名。然后,您可以使用这些alises引用各个列,查询更容易阅读。

SELECT t1.Invoice,
       t1.DateRaised,
       t1.Amount,
       t1.Staff,
       t2.Invoice,
       t3.TeamLeader,
FROM Alphadata t1                      -- t1, t2 and t3 are aliases, or nicknames
INNER JOIN TlAuth t2                   -- for the actual tables in your query
    ON t1.invoice = t2.invoice
INNER JOIN Agents t3
    ON t3.Alphaname = t1.Staff;

答案 2 :(得分:0)

    SELECT Alphadata.Invoice, Alphadata.DateRaised, Alphadata.Amount, Alphadata.Staff, Agents.TeamLeader, TlAuth.Invoice
    FROM (Alphadata 
    INNER JOIN TlAuth ON Alphadata.invoice = TlAuth.invoice)
    INNER JOIN Agents ON Agents.Alphaname = Alphadata.Staff;

尝试以上方法。如果省略ON子句,则会生成代理的笛卡尔积和Alphadata。您可以阅读有关笛卡儿积here的更多信息。

编辑1:从您的评论中我猜您正在使用MS Access?如果是这样,如果您有多个JOIN - see here,我发现您需要括号。我在上面的查询中添加了它们。请再试一次。

相关问题