【问题标题】:Problems with More than 1 Left joins in MSAccessMS Access 中超过 1 个左连接的问题
【发布时间】:2009-06-29 10:34:06
【问题描述】:

这和我之前的问题More than 1 Left joins in MSAccess有关

问题是我有 3 个左连接,后跟一个 AND 运算符来检查 1 个条件。

如果我运行,则会收到错误“不支持连接表达式”

查询如下:

SELECT * FROM(( EMPLOYEE AS E  LEFT JOIN DEPARTMENT AS D ON E.EID=D.EID)
                 LEFT JOIN MANAGERS M ON D.DID=M.DID)
             LEFT JOIN MANAGERDETAILS MD  ON M.MDID=MD.MDID
 **AND E.ENO=MD.ENO**

如果我取出AND 部分,它可以正常工作。

有什么想法吗?

【问题讨论】:

  • 您是手动编写联接还是让 QBE 为您编写?我发现让 QBE 来做会更好。
  • 也许我遗漏了一些东西,但 QBE 不正确支持多个 LEFT JOIN,因为您无法真正设置连接操作的顺序。我发现多个连接往往会以一团糟而告终,而且很少能达到我的预期。我通常总是使用 SQL 来处理更复杂的查询,这让我可以更好地控制查询的构建方式。
  • 这个查询并不复杂。使用 QBE。

标签: sql ms-access


【解决方案1】:

我会这样写:

SELECT EDM.*, MANAGERDETAILS.*
FROM (
    SELECT ED.*, MANAGERS.*
    FROM (
        SELECT EMPLOYEE.*, DEPARTMENT.*
        FROM EMPLOYEE
        LEFT JOIN DEPARTMENT
        ON EMPLOYEE.EID = DEPARTMENT.EID
    ) AS ED
    LEFT JOIN MANAGERS
    ON ED.DID = MANAGERS.DID
) AS EDM
LEFT JOIN MANAGERDETAILS
ON EDM.MDID = MANAGERDETAILS.MDID
    AND EDM.ENO = MANAGERDETAILS.ENO

基本上,您一次连接一个表并为结果设置别名,然后您可以将其用于下一次连接。

您可以在 Access 中实现任意复杂的左连接,仅通过别名较小的子集。 您的双重联接子句可能不起作用,因为其中一个成员引用的结果集比在该查询级别可见的结果集更深。

【讨论】:

    【解决方案2】:

    您正在尝试匹配 ON 子句中的两个文件,并且任何表都是 MANAGERDETAILS。

    我不知道你想用这个 sql 得到什么,但你可以将 AND 过滤器放在正确的 ON 上(在 E.EID = D.EID 之后),或者你可以更改用于过滤的表当前为 ON,因此其中一个字段属于 MANAGERDETAILS。

    【讨论】:

    • 你的意思是 SELECT * FROM(( ( EMPLOYEE AS E LEFT JOIN DEPARTMENT AS D ON E.EID=D.EID) LEFT JOIN MANAGERS M ON D.DID=M.DID) LEFT JOIN MANAGERDETAILS MD ON M.MDID=MD.MDID ) AND E.ENO=D.ENO 在这种情况下,它也会抛出错误。您能否重写上面的查询。不用担心结果。
    • 这就是我的意思: SELECT * FROM(( ( EMPLOYEE AS E LEFT JOIN DEPARTMENT AS D ON E.EID=D.EID AND E.ENO=D.ENO) LEFT JOIN MANAGERS M ON D.DID=M.DID) LEFT JOIN MANAGERDETAILS MD ON M.MDID=MD.MDID)
    【解决方案3】:

    您需要再次引用 Employee 表,因为您正试图提取经理的员工记录。

    选择 * 从 ( ( (E.EID = D.EID 上的 E 员工左加入 D 部门) 左加入经理作为 M ON D.DID = M.DID ) 左加入 MANAGERDEALS 作为 MD 开 M.DID = MD.MDID ) 在 MD.ENO = E2.ENO 上以 E2 的身份加入员工;

    我们没有关于您期望的数据的足够信息,但该查询将执行。

    我知道在 Access 中您需要处理括号,但您可以使用图形查询生成器来完成此操作。

    【讨论】:

    • 这不起作用,因为如果你想在 MS Access 中执行多个左连接,你应该在 From 子句中使用括号
    • 我想这解释了“我知道在 Access 中你需要处理括号..”部分。
    猜你喜欢
    • 2012-08-29
    • 2011-08-09
    • 1970-01-01
    • 2013-07-31
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多