2017-02-02 5 views
-2

以下の2つのコーディングの違いはわかりません。最初はLEFT JOINのWHEREを使います。 2番目のコードはANDを使用しています。私は各コーディングから得られる出力は何か分かりません。要するにSQLでのWHEREの使用

SELECT c.FirstName, c.LastName, oh.SalesOrderNumber 
FROM SalesLT.Customer AS c 
LEFT OUTER JOIN SalesLT.SalesOrderHeader AS oh 
ON c.CustomerID = oh.CustomerID 
WHERE oh.SalesOrderNumber IS NULL 
ORDER BY c.CustomerID; 


SELECT c.FirstName, c.LastName, oh.SalesOrderNumber 
FROM SalesLT.Customer AS c 
LEFT OUTER JOIN SalesLT.SalesOrderHeader AS oh 
ON c.CustomerID = oh.CustomerID 
AND oh.SalesOrderNumber IS NULL 
ORDER BY c.CustomerID; 
+1

2つのクエリは同じです。 – scaisEdge

+0

なぜあなたはそれらを実行しませんか? – Haris

+0

http://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins –

答えて

7

、最初のクエリは、2番目のクエリは、それが顧客に接合され前SalesOrderHeader に印加する一方、これらは、接合された後結合テーブルにフィルタを適用します。この区別は重要です。

SalesOrderHeaderテーブルに存在しないCustomerIDがCustomerテーブルにあるとします。たとえば、あなたは左の外側が

SELECT c.FirstName, c.LastName, oh.SalesOrderNumber 
FROM SalesLT.Customer AS c 
LEFT OUTER JOIN SalesLT.SalesOrderHeader AS oh 
    ON c.CustomerID = oh.CustomerID 

を結合を実行すると(それがテーブルを残しているので)あなたは、顧客テーブルからすべてのレコードが表示されます以下の2つの表

Customer Table: 
+ --------- + -------- + ---------- + 
| Firstname | Lastname | CustomerID | 
+ --------- + -------- + ---------- + 
| Bob  | Dylan | 1   | 
| Donald | Trump | 2   | 
| Me Myself | and I | 14   | 
| Guy  | Gisbon | 86   | 
| Megan  | Meganson | 87   | 
+ --------- + -------- + ---------- + 


SalesOrderHeader Table: 
+ ---------------- + ----------- + 
| SalesOrderNumber | CustomerID | 
+ ---------------- + ----------- + 
| 1681351   | 1   | 
| 1354894   | 86   | 
| 1354900   | 13   | 
| 1351666   | 86   | 
+ ---------------- + ----------- + 

を考えますSalesOrderHeaderテーブルの一致しないレコードはすべてNULLとして表示されます。あなたはwhere句

WHERE oh.SalesOrderNumber IS NULL 

を適用するのであれば私たちの例では、あなたは

Resulting Joined Table 
+ --------- + -------- + ---------------- + 
| Firstname | Lastname | SalesOrderNumber | 
+ --------- + -------- + ---------------- + 
| Bob  | Dylan | 1681351   | 
| Donald | Trump | null    | 
| Guy  | Gisbon | 1354894   | 
| Guy  | Gisbon | 1351666   | 
| Megan  | Meganson | null    | 
+ --------- + -------- + ---------------- + 

は今、あなたはSalesOrderNumberがnullの結果テーブルのサブセットを選択しているになるだろう。ここでは、

Filter in where clause 
+ --------- + -------- + ---------------- + 
| Firstname | Lastname | SalesOrderNumber | 
+ --------- + -------- + ---------------- + 
| Donald | Trump | null    | 
| Megan  | Meganson | null    | 
+ --------- + -------- + ---------------- + 

は今のヌルフィルタが結合条件に含まれている第二のクエリ、見てみましょうになるだろう。 SQLはSalesOrderHeaderテーブルからnull SalesOrderNumbersを探します。この例では、nullレコードがないため、Customerテーブルを空のSalesOrderHeaderテーブルに結合しています。結果は次のようになります

Filter in join condition 
+ --------- + -------- + ---------------- + 
| Firstname | Lastname | SalesOrderNumber | 
+ --------- + -------- + ---------------- + 
| Bob  | Dylan | null    | 
| Donald | Trump | null    | 
| Guy  | Gisbon | null    | 
| Megan  | Meganson | null    | 
+ --------- + -------- + ---------------- + 

この区別は外部結合でのみ重要です。内部結合を使用している場合、フィルタを結合条件またはw​​here句に入れると、同じ結果になります。

+0

詳細な回答ありがとうございました。君はスター。 –

関連する問題