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 ...
问候
使用显式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)
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)
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",因此您不必明确地为它们添加别名,尽管它可能很有用.