2017-10-25 14 views
0

サブクエリが結合の形でどのように見えるかを視覚化するのに問題があります。具体的には、以下のSQL:私は、私が代わりに参加するにサブクエリとの声明を有効にするときに何をすべきかについていくつかのヒントを受け取ることができればサブクエリの代わりに結合を使用してSQLコードを書き直し

SELECT DISTINCT e.EmployeeID, e.LastName, e.FirstName 
FROM Employees e 
INNER JOIN Orders o ON e.EmployeeID = o.EmployeeID 
WHERE EXISTS 
(
    SELECT c.Country 
    FROM Customers c 
    WHERE c.Country = e.Country 
) 

幸いです。

+1

....「Customers」には重複する国が含まれる可能性が高いため、_a_サブクエリーが必要です。また、 'DISTINCT'が内部サブクエリにあるように、そこからデータを抜かないと、' Orders'もそこに移動したいと思うでしょう。 –

+0

...そして 'WHERE EXISTS(SELECT ... Orders JOIN Customers ...)'の場合、サブクエリでは、従業員から選択しているだけなので、別名は必要ありません。 – wildplasser

答えて

2

あなたは重複に注意する必要があるが、EXISTSの変換は非常に直接的である:

SELECT DISTINCT e.EmployeeID, e.LastName, e.FirstName 
FROM Employees e INNER JOIN 
    Orders o 
    ON e.EmployeeID = o.EmployeeID INNER JOIN 
    (SELECT DISTINCT c.Country 
     FROM Customers c 
    ) c 
    ON c.Country = e.Country 
-1

これがきれいに見えます。実際には、そうではありません。


SELECT DISTINCT e.EmployeeID, e.LastName, e.FirstName 
FROM Employees e 
JOIN Orders o ON o.EmployeeID = e.EmployeeID 
JOIN Customers c ON c.Country = e.Country 
     ; 

ポイントが複数の一致する行がordersCustomersのために存在する場合、これらはすべてEmployeeレコードの別々のコピーが可能になりますということです合併したこれらは後にDISTINCTによって抑制されなければならない(オプティマイザがこれをキャッチしたり、そうでないかもしれない)


点がある:あなたが唯一の従業員から列を選択しているので、あなたは、明確なを必要といけない:

:多かれ少なかれ 醜いスタイル
SELECT e.EmployeeID, e.LastName, e.FirstName 
FROM Employees e 
WHERE EXISTS( 
    SELECT * FROM Orders o 
    WHERE o.EmployeeID = e.EmployeeID 
) 
AND EXISTS(
    SELECT * FROM Customers c 
    WHERE c.Country = e.Country 
); 

あるいは、


SELECT e.EmployeeID, e.LastName, e.FirstName 
FROM Employees e 
WHERE EXISTS(
    SELECT c.Country 
    FROM Orders o 
    JOIN Customers c 
    ON o.EmployeeID = e.EmployeeID 
    AND c.Country = e.Country 
); 
関連する問題