【问题标题】:Can I use INNER JOIN to replace WHERE?我可以使用 INNER JOIN 代替 WHERE 吗?
【发布时间】:2012-11-02 13:11:33
【问题描述】:

我有三张桌子。员工、项目(多对多)和员工项目。

我想检索每个员工的姓名和他们各自的项目。

我试图使用这个查询:

SELECT Employee.name, Project.name 
FROM Employee, Project
INNER JOIN EmployeeProject ON Employee.empNo = EmployeeProject.empNo
INNER JOIN EmployeeProject ON Project.projectNo = EmployeeProject.projectNo;

Access 给了我一个语法错误。然后我尝试了这个查询并且它有效:

SELECT Employee.name, Project.name 
FROM Employee, Project, EmployeeProject
WHERE Employee.empNo = EmployeeProject.empNo AND EmployeeProject.projectNo = Project.projectNo;

我的问题是;可以使用 WHERE 链接表还是有更好的方法,比如 INNER...

问候

【问题讨论】:

  • 如果您使用 MS ACCESS,您必须将“(”和“)”放入您的 INNER JOIN。它要求这样做。在员工和项目中也使用内部联接。
  • 如果您有兴趣:之前已经询问过INNER JOIN vs WHERE 的一般比较。
  • 不是根据this documentation 显示的未包含() 的连接示例。
  • 好的。只是根据我之前在谷歌上搜索该语法的经验来说明。
  • 涉及多个 JOIN 时需要它,因为 Access 不想猜测解析顺序。

标签: sql database ms-access inner-join where


【解决方案1】:

当使用显式JOINs 时,您不要在FROM 子句中用逗号分隔表。显式 JOIN 的正确语法(优于使用 WHERE 子句的旧隐式语法)是:

SELECT
  /* Probably will need to give these aliases since the're both called name */
  Employee.name AS empname,
  Project.name AS projname 
FROM 
  Employee
  /* Employee joins through EmployeeProject */
  INNER JOIN EmployeeProject ON Employee.empNo = EmployeeProject.empNo
  /* ...into Project */
  INNER JOIN Project ON Project.projectNo = EmployeeProject.projectNo;

如果 Access 抱怨,它可能需要 () 围绕连接子句(尽管我找不到指定它的文档)

FROM 
  (Employee
  INNER JOIN EmployeeProject ON Employee.empNo = EmployeeProject.empNo)
  INNER JOIN Project ON Project.projectNo = EmployeeProject.projectNo;

【讨论】:

  • 它仍然给我一个错误。它说语法错误(缺少运算符)
  • 在第一个连接对周围尝试()
  • 这就是我所说的。我找不到任何有关它的文档,但访问需要它。 :)
  • 现在它正在工作。谢谢。只有一个问题相关。我得到的结果显示了所有员工及其相关项目,这很好,但是如果我想显示所有员工,无论他们是否在项目中。谢谢
  • EmployeeEmployeeProject 之间更改为LEFT JOIN
【解决方案2】:
  1. 需要括号,即使在 Access 2010 中,当您涉及超过 2 个表时。
  2. JOIN 中的表顺序很重要。您不能从 Employee -> Project(不相关)跳转到 EmployeeProject(同时加入)

这行得通

SELECT Employee.name, Project.name 
FROM ((Employee
INNER JOIN EmployeeProject ON Employee.empNo = EmployeeProject.empNo)
INNER JOIN Project ON EmployeeProject.projectNo = Project.projectNo);

注意:您可以将外部括号放在 FROM 和最后的 ; 之间,但更安全的做法是始终包含它。

可以嵌套连接 - 如果您像这样嵌套表格(Employee、Project、EmployeeProject)并保留它们的顺序:

SELECT Employee.name, Project.name 
FROM Employee
INNER JOIN (Project 
            INNER JOIN EmployeeProject 
              ON EmployeeProject.projectNo = Project.projectNo)
  ON Employee.empNo = EmployeeProject.empNo;


使用显式 JOIN 语法更加灵活,因为您现在可以显示员工,即使他们没有任何项目在 - 只需更改为 LEFT 连接。
SELECT Employee.name, Project.name 
FROM ((Employee
LEFT JOIN EmployeeProject ON Employee.empNo = EmployeeProject.empNo)
LEFT JOIN Project ON EmployeeProject.projectNo = Project.projectNo);

注意:在数据表视图和表单中,生成的列被命名为“Employee.name”和“Project.name”,因此您不必明确地给它们起别名,尽管它可能很有用。

【讨论】:

  • +1 并且希望列(字段)不会被保留字(例如名称)调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 2021-06-18
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
相关资源
最近更新 更多