Using WHERE in SQL

后端 未结 1 654
既然无缘
既然无缘 2021-01-29 11:32

I do not understand the difference between two coding given below. First one uses WHERE in LEFT JOIN. The second code one uses AND. I do not understand

1条回答
  •  盖世英雄少女心
    2021-01-29 12:09

    In short, the first query applies a filter to the joined tables after they are joined, whereas the second query applies it to SalesOrderHeader before it is joined to Customer. The distinction is important.

    Suppose your Customer table has certain CustomerID's that do not exist in your SalesOrderHeader table. For example, consider the following two tables

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

    When you perform the left outer join

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

    you will see all the records from the Customer table (because it is the left table), but any unmatched records from the SalesOrderHeader table will appear as nulls. So in our example, you would get

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

    Now if you apply the where clause

    WHERE oh.SalesOrderNumber IS NULL
    

    you are selecting a subset of the result table where the SalesOrderNumber is null. Here, you would get

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

    Now let's look at the 2nd query, where the null filter is included in the join condition. SQL will look for null SalesOrderNumbers from the SalesOrderHeader table. In our example, we don't have any null records, so you are essentially joining your Customer Table to an empty SalesOrderHeader table. The result would look like

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

    This distinction is only important for outer joins. If you're using an inner join, putting the filter in the join condition or in the where clause results in the same thing.

    0 讨论(0)
提交回复
热议问题