2017-02-02 34 views
-2

我不明白下面給出的兩種編碼之間的區別。第一個在LEFT JOIN中使用WHERE。第二個代碼使用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

這兩個查詢是一樣的。 – scaisEdge

+0

爲什麼不運行它們? – Haris

+0

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

回答

7

總之,第一查詢將濾波器應用於後它們所連接的連接表,而第二查詢其應用於的SalesOrderHeader 之前它被連接到客戶。區別很重要。

假設您的Customer表具有您的SalesOrderHeader表中不存在的某些CustomerID。例如,考慮下面兩個表

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   | 
+ ---------------- + ----------- + 

當您執行左外連接

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

,你會看到從客戶表中的所有記錄(因爲它是表)但是SalesOrderHeader表中的任何不匹配的記錄都將顯示爲空值。所以在我們的例子中,你會得到

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

現在,如果你申請的where子句

WHERE oh.SalesOrderNumber IS NULL 

您選擇的結果表的一個子集,其中SalesOrderNumber爲空。在這裏,你會得到

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

現在我們來看看第二個查詢,其中null過濾器包含在連接條件中。 SQL將從SalesOrderHeader表中查找空的SalesOrderNumbers。在我們的示例中,我們沒有任何空記錄,因此您基本上將您的Customer Table連接到一個空的SalesOrderHeader表。結果看起來像

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

這種區別只對外連接很重要。如果您使用內部聯接,將過濾器置於聯接條件或where子句中會導致相同的結果。

+0

非常感謝你的詳細解答。你是明星。 –