0

Access で複数のテーブルを結合する SQL があります。実行しようとすると、「JOIN」でエラーが発生します(具体的には「JOIN式はサポートされていません」)。問題を1つの結合に絞り込んだと思いますが、なぜそれが機能しないのかは私には意味がありません. したがって、元の完全な SQL FROM 句は次のようになります。

FROM  (
     (
      Customers RIGHT JOIN 
            (
            Sales LEFT JOIN SaleType ON Sales.SalesForID = SaleType.SalesForID
            ) 
      ON Customers.CustomerID = Sales.CustomerID
     ) LEFT JOIN 
          (
           StudentContracts LEFT JOIN
               (
               StudentsClasses INNER JOIN Classes ON StudentsClasses.ClassID = Classes.ClassID
                )
            ON StudentContracts.CustomerID = StudentsClasses.CustomerID
           ) 
       ON Customers.CustomerID = StudentContracts.CustomerID   
 )

クエリが失敗すると思われる部分は、この「LEFT」結合にあります。

(
  StudentContracts LEFT JOIN
          (
          StudentsClasses INNER JOIN Classes ON StudentsClasses.ClassID = Classes.ClassID
          )
   ON StudentContracts.CustomerID = StudentsClasses.CustomerID
)

「LEFT」を「INNER」に切り替えてみましたが、うまくいきます。私はそれを「右」に切り替えましたが、動作します。「LEFT」結合では機能せず、他の結合では機能するのはなぜですか? 私が必要としているのは、StudentContracts にリンクされた結合された「Classes」テーブルのレコードだけでなく、Classes テーブルにレコードのない StudentContracts を示す結果です。この投稿の回答によると: SQL Server での左結合と右結合の違い私は左結合が必要であり、これはうまくいくはずです。

ここで何が欠けていますか?

4

3 に答える 3

3

括弧が多すぎて、順序が正しくありません。これは、MS Access のクエリ デザイン ウィンドウで作成するのが最も簡単です。そうすれば、すべてが生成されます。SQL ビューに切り替えて確認できます。

たとえば、上記は次のようになります。

SELECT * 
FROM (Customers 
RIGHT JOIN Sales 
ON Customers.CustomerID = Sales.CustomerID)
LEFT JOIN SaleType 
ON Sales.SalesForID = SaleType.SalesForID

RIGHT JOIN は、LEFT JOIN と簡単に記述できるため、混乱を避けるために避けるのが慣習です。

于 2012-08-16T12:41:46.443 に答える
0

2つの提案は実際には答えではなく、トラブルシューティングに関する提案であり(うまくいった)、今答えを見つけたので、私は自分のQに答えるべきだと思います。

確かに、以前に定義された結合に問題がありました。StudentsClasses は、DB リレーションシップで多対 1 ベースで Classes に結合されます。これは、データベース全体のほとんどの接続で、これら 2 つのテーブルがリンクされていると見なされる方法です。この場合のみ、少し異なる結合を希望します。SQL が内部結合を要求したとき、アクセス プログラムが何を意味するか (内部結合または外部結合) を混乱させたようです。それを適切な外部結合に変更することで、プログラムは正常に動作し始めました。

内部結合は本当に私が望んでいたものですが、この場合、余分なレコードのある側は他の結合によって削減され、いずれにせよ Class テーブルに一致するレコードが生成されないため、それは問題ではありませんでした (少なくとも私が見る限り)。

だから、私を正しい方向に向けてくれたRemouMatt Donnanに感謝します!

于 2012-08-16T14:46:07.953 に答える
0

Access は、ブラケット結合についてうるさいです。通常、次のように記述されたクエリを確認します。

FROM (((((Sales
LEFT JOIN Customers ON Sales.CustomerID = Customers.CustomerID)
LEFT JOIN SaleType ON Sales.SalesForID = SaleType.SalesForID)
LEFT JOIN StudentContracts ON Customers.CustomerID = StudentContracts.CustomerID)
LEFT JOIN StudentsClasses ON StudentContracts.CustomerID = StudentsClasses.CustomerID)
LEFT JOIN Classes ON StudentsClasses = Classes.ClassID)

テーブルの正確な構造を知らなければ、これで目的の出力が得られるかどうかを判断するのはかなり困難です。ただし、これに似たものが機能することを期待しています。あなたが言った:

StudentContracts にリンクされた結合された「Classes」テーブルのレコードだけでなく、Classes テーブルにレコードのない StudentContracts も表示する結果が必要です

これは複雑な言い方に思えるStudentContracts LEFT JOIN Classes

(間違いがあれば誰かが訂正してくれるでしょう。)

于 2012-08-16T14:49:32.413 に答える