3

私は3つのテーブルを持っています。従業員、プロジェクト (多対多)、および 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;

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
  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" という名前になるため、エイリアスを明示的に付ける必要はありませんが、便利な場合があります。

于 2012-11-14T02:37:10.430 に答える
5

明示的な s を使用する場合、句JOIN内でテーブルをコンマで区切らないでください。明示的な構文 (句を使用した古い暗黙的な構文よりも優先される)FROMの正しい構文は次のとおりです。JOINWHERE

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;

アクセスが不平を言っている場合は、結合句の周りが必要になる場合があります()(ただし、それを指定するドキュメントは見つかりません)

FROM 
  (Employee
  INNER JOIN EmployeeProject ON Employee.empNo = EmployeeProject.empNo)
  INNER JOIN Project ON Project.projectNo = EmployeeProject.projectNo;
于 2012-11-14T02:13:57.267 に答える