3

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

我想检索每个员工的姓名及其各自的项目。

我试图使用这个查询:

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 ...

问候

4

2 回答 2

5

使用显式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 抱怨,它可能需要()围绕 join 子句(尽管我找不到指定它的文档)

FROM 
  (Employee
  INNER JOIN EmployeeProject ON Employee.empNo = EmployeeProject.empNo)
  INNER JOIN Project ON Project.projectNo = EmployeeProject.projectNo;
于 2012-11-14T02:13:57.267 回答
5
  1. 当您涉及超过 2 个表时,即使在 Access 2010 中,也需要括号
  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放在 和 final之间;,但更安全的做法是始终包含它。

如果您像这样嵌套它们,您可以嵌套连接 - 并保留表(员工、项目、员工项目)的顺序:

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”,因此您不必明确地给它们起别名,尽管它可能很有用。

于 2012-11-14T02:37:10.430 回答