SQL Server: What is the difference between CROSS JOIN and FULL OUTER JOIN?

前端 未结 10 1523
星月不相逢
星月不相逢 2020-11-28 18:38

What is the difference between CROSS JOIN and FULL OUTER JOIN in SQL Server?

Are they the same, or not? Please explain. When would one use either of these?

相关标签:
10条回答
  • 2020-11-28 19:09

    A cross join produces a cartesian product between the two tables, returning all possible combinations of all rows. It has no on clause because you're just joining everything to everything.

    A full outer join is a combination of a left outer and right outer join. It returns all rows in both tables that match the query's where clause, and in cases where the on condition can't be satisfied for those rows it puts null values in for the unpopulated fields.

    This wikipedia article explains the various types of joins with examples of output given a sample set of tables.

    0 讨论(0)
  • 2020-11-28 19:12

    SQL FULL OUTER JOIN

    • The FULL OUTER JOIN returns all rows from the left table (table1) and from the right table (table2) irrespective of the match.

    • The FULL OUTER JOIN keyword combines the result of both LEFT OUTER JOIN and RIGHT OUTER JOIN

    • SQL full outer join is also known as FULL JOIN

    Reference : http://datasciencemadesimple.com/sql-full-outer-join/

    SQL CROSS JOIN

    • In SQL CROSS JOIN Each Row of first table is mapped with the each and every row of second table.

    • Number of rows produced by a result set of CROSS JOIN operation is equal to number of rows in the first table multiplied by the number of rows in the second table.

    • CROSS JOIN is also known as Cartesian product / Cartesian join

    • Number of rows in table A is m, Number of rows in table B is n and resultant table will have m*n rows

    Reference:http://datasciencemadesimple.com/sql-cross-join/

    0 讨论(0)
  • 2020-11-28 19:13

    Here is an example where both the FULL OUTER JOIN and CROSS JOIN return the same result set without NULL returned. Please note the 1 = 1 in the ON clause for the FULL OUTER JOIN:

    declare @table1 table (     col1    int,    col2    int ) 
    declare @table2 table (     col1    int,    col2    int )
    
    insert into @table1 select  1, 11   union all select    2, 22   
    
    insert into @table2 select  10, 101 union all select     2, 202
    
    select  *
    from    @table1 t1 full outer join @table2 t2
        on  1 = 1
    
    (2 row(s) affected)
    
    (2 row(s) affected)
    col1        col2        col1        col2
    ----------- ----------- ----------- -----------
    1           11          10          101
    2           22          10          101
    1           11          2           202
    2           22          2           202
    
    select  *
    from    @table1 t1 cross join @table2 t2
    
    col1        col2        col1        col2
    ----------- ----------- ----------- -----------
    1           11          10          101
    2           22          10          101
    1           11          2           202
    2           22          2           202
    
    (4 row(s) affected)
    
    0 讨论(0)
  • 2020-11-28 19:22

    Cross join :Cross Joins produce results that consist of every combination of rows from two or more tables. That means if table A has 3 rows and table B has 2 rows, a CROSS JOIN will result in 6 rows. There is no relationship established between the two tables – you literally just produce every possible combination.

    Full outer Join : A FULL OUTER JOIN is neither "left" nor "right"— it's both! It includes all the rows from both of the tables or result sets participating in the JOIN. When no matching rows exist for rows on the "left" side of the JOIN, you see Null values from the result set on the "right." Conversely, when no matching rows exist for rows on the "right" side of the JOIN, you see Null values from the result set on the "left."

    0 讨论(0)
  • 2020-11-28 19:23

    A full outer join combines a left outer join and a right outer join. The result set returns rows from both tables where the conditions are met but returns null columns where there is no match.

    A cross join is a Cartesian product that does not require any condition to join tables. The result set contains rows and columns that are a multiplication of both tables.

    0 讨论(0)
  • 2020-11-28 19:26

    I'd like to add one important aspect to other answers, which actually explained this topic to me in the best way:

    If 2 joined tables contain M and N rows, then cross join will always produce (M x N) rows, but full outer join will produce from MAX(M,N) to (M + N) rows (depending on how many rows actually match "on" predicate).

    EDIT:

    From logical query processing perspective, CROSS JOIN does indeed always produce M x N rows. What happens with FULL OUTER JOIN is that both left and right tables are "preserved", as if both LEFT and RIGHT join happened. So rows, not satisfying ON predicate, from both left and right tables are added to the result set.

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