Is there a logical difference between putting a condition in the ON clause of an inner join versus the where clause of the main query?

前端 未结 3 565
旧时难觅i
旧时难觅i 2021-01-06 03:33

Consider these two similar SQLs

(condition in ON clause)

select t1.field1, t2.field1
from
table1 t1 inner join table2 t2 on t1.id = t2.id and t1.bool         


        
相关标签:
3条回答
  • 2021-01-06 04:15

    In your specific case, the t1.boolfield specifies an additional selection condition, not a condition for matching records between the two tables, so the second example is more correct.

    If you're speaking about the cases when a condition for matching records is put in the ON clause vs. in the WHERE clause, see this question.

    0 讨论(0)
  • 2021-01-06 04:18

    For INNER JOIN, there is no effective difference, although I think the second option is cleaner.

    For LEFT JOIN, there is a huge difference. The ON clause specifies which records will be selected from the tables for comparison and the WHERE clause filters the results.

    Example 1: returns all the rows from tbl 1 and matches them up with appropriate rows from tbl2 that have boolfield=1

    Select *
    From tbl1
      LEFT JOIN tbl2 on tbl1.id=tbl2.id and tbl2.boolfield=1
    

    Example 2: will only include rows from tbl1 that have a matching row in tbl2 with boolfield=1. It joins the tables, and then filters out the rows that don't meet the condition.

    Select *
    From tbl1
      LEFT JOIN tbl2 on tbl1.id=tbl2.id
    WHERE tbl2.boolfield=1
    
    0 讨论(0)
  • 2021-01-06 04:33

    Both versions return the same data.

    Although this is true for an inner join, it is not true for outer joins.

    Stylistically, there is a third possibility. In addition to your two, there is also:

    select t1.field1, t2.field1
    from (select t1.*
          from table1 t1
          where t1.boolfield = 1
         ) t1 inner join
         table2 t2
        on t1.id = t2.id
    

    Which is preferable all depends on what you want to highlight, so you (or someone else) can later understand and modify the query. I often prefer the third version, because it emphasizes that the query is only using certain rows from the table -- the boolean condition is very close to where the table is specified.

    In the other two cases, if you have a long query, it can be problematic to figure out what "t1" really means. I think this is why some people prefer to put the condition in the ON clause. Others prefer the WHERE clause.

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