我可以使用INNER JOIN替换WHERE吗?

Cam*_*mus 2 sql database ms-access inner-join where

我有三张桌子.员工,项目(多对多)和EmployeesProject.

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

我试图使用此查询:

SELECT Employee.name, Project.name 
FROM Employee, Project
INNER JOIN EmployeeProject ON Employee.empNo = EmployeeProject.empNo
INNER JOIN EmployeeProject ON Project.projectNo = EmployeeProject.projectNo;
Run Code Online (Sandbox Code Playgroud)

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

SELECT Employee.name, Project.name 
FROM Employee, Project, EmployeeProject
WHERE Employee.empNo = EmployeeProject.empNo AND EmployeeProject.projectNo = Project.projectNo;
Run Code Online (Sandbox Code Playgroud)

我的问题是; 可以使用WHERE来链接表,或者有更好的方法来实现它,比如INNER ...

问候

Mic*_*ski 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;
Run Code Online (Sandbox Code Playgroud)

如果Access抱怨,可能需要()围绕join子句(虽然我找不到指定它的文档)

FROM 
  (Employee
  INNER JOIN EmployeeProject ON Employee.empNo = EmployeeProject.empNo)
  INNER JOIN Project ON Project.projectNo = EmployeeProject.projectNo;
Run Code Online (Sandbox Code Playgroud)


Ric*_*iwi 5

  1. 支架ARE需要,即使在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);
Run Code Online (Sandbox Code Playgroud)

注意:您可以删除外部括号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;
Run Code Online (Sandbox Code Playgroud)


使用显式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);
Run Code Online (Sandbox Code Playgroud)

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