2017-06-07 14 views
2

SQLのスキルを向上させるために練習クエリを実行しています(私は初心者です)、Northwindデータベースの使用に関する助けが必要なこの問題が発生しました。要求されたクエリは次のとおりです。SQLの比較クエリ

が同じ都市の顧客に販売されている従業員の従業員とその都道府県の名前を指定します。

は、私は、このされたために書いたもの:

USE Northwind; 
    SELECT DISTINCT FirstName, LastName, e.City 
    FROM Employees e 
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID 
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID 
    INNER JOIN Customers ON c.City = e.City 
    WHERE e.City = ANY(SELECT Customers.City FROM Customers); 

私は6人の従業員を返されていますが、私は、彼らが正しいと私は私のWHERE文が同様に間違ったものであると信じていることを確認していません。

基本的に私の質問は正しい結合文を使用しているのですが、どのようにWHERE文で結果をフィルタリングするのですか?特定のレコードを他のレコードとどのように比較するのかが正確にはわかりません。 Javaのバックグラウンドから来て、私は、個々の "オブジェクト"(レコード)を別の "オブジェクト"の特定のフィールドでチェックできるfor-loopsに慣れています。この場合、Employeesテーブルの各レコードのCity属性をCustomersテーブルのレコードのCity属性で確認する方法が不思議です。すべてのアドバイスは感謝しています、ありがとう!

+1

Customersテーブルに対して2回参加しているので、結合が正しくありません。 「INNER JOIN customers ON」を「AND」に変更してWHERE句を取り除くと、あなたはうまくいくはずです。 – Welbog

答えて

1

は、私はあなたが一度だけ、顧客テーブルを結合し、

SELECT DISTINCT FirstName, LastName, e.City 
    FROM Employees e 
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID 
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID AND c.City = e.City 

はまたあなただけ参加することができます例えば、あなたの参加要件として、両方の要件を(従業員と同じ順序と同じ都市にある)持っている必要があると思います顧客を発注IDで検索し、where句で都市の要件をフィルタリングします。パフォーマンスワイズ私はあなたの頭のラウンドを取得するための重要な部分はその後だと思うあなたはいくつかの点でスクリプトを振り返るしようとしている場合、それは

SELECT DISTINCT FirstName, LastName, e.City 
    FROM Employees e 
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID 
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID 
    WHERE e.City = C.City 

を覚えて、あなたを助けるかもしれないがいずれかの違いがあってはなりませんあなたはテーブルに参加しています。それは実質的には両方からの列を持つ1つのテーブルです(または複数の結合を持つもの)。内部結合条件は、2つのテーブルの間に一致がない行をフィルタリングし、次に列を比較することになります。

+0

私はあなたがジョインのためのANDステートメントを使用できるか分からなかったので、教えてくれてありがとう!また、これを解釈する方法は、実際に特定の顧客に販売された従業員に対して、要求されたクエリが同じCity値を持つため、論理的に正しいとは思わないことです。 EmployeeIDのINNER JOINはこれをカバーしていますか? –

+0

はい、このケースでは機能します。内部結合を使用して2つのテーブルを結合すると、on節が除外される両方のテーブルの列を持つより大きな新しいテーブルを効果的に作成します。私はあなたが視覚化するのに役立つ場合は、いくつかのサンプルテーブルと答えを出力することができますか? – MarkD

+0

私は理解します。私は基本レベルでJoinsを理解しています。この場合、実際にクエリに必要な結果をフィルタリングするかどうかはわかりませんでした。助けてくれてありがとう! –