首页 文章

SQL Server:CROSS JOIN和FULL OUTER JOIN有什么区别?

提问于
浏览
155

SQL Server中的CROSS JOIN和FULL OUTER JOIN有什么区别?

他们是一样的,不是吗?请解释 . 什么时候会使用其中任何一个?

10 回答

  • 20

    交叉连接在两个表之间生成笛卡尔积,返回所有行的所有可能组合 . 它没有 on 条款,因为你只是将所有内容都加入到了所有内容中 .

    full outer joinleft outerright outer 连接的组合 . 它返回两个表中与查询的 where 子句匹配的所有行,如果这些行无法满足 on 条件,则会为未填充的字段输入 null 值 .

    这篇wikipedia文章解释了各种类型的连接,给出了一组示例表的输出示例 .

  • 5

    对某些人来说可能并不总是显而易见的一件事是,与空表(或结果集)的交叉连接会导致空表(M x N;因此M x 0 = 0)

    除非M和N都为0,否则完整外部联接将始终具有行 .

  • 14

    我想在其他答案中添加一个重要方面,它以最佳方式向我解释了这个主题:

    如果2个连接表包含M和N行,则交叉连接将始终产生(M x N)行,但完全外连接将从MAX(M,N)到(MN)行产生(取决于实际匹配的行数)关于“谓词” .

    编辑:

    从逻辑查询处理的角度来看,CROSS JOIN确实总是产生M×N行 . FULL OUTER JOIN会发生什么,左表和右表都被“保留”,好像左和右连接都发生了 . 因此,左表和右表中不满足ON谓词的行将添加到结果集中 .

  • 9

    交叉连接:交叉连接生成的结果包含来自两个或多个表的每个行的组合 . 这意味着如果表A有3行而表B有2行,则CROSS JOIN将产生6行 . 这两个表之间没有 Build 任何关系 - 你实际上只是产生了所有可能的组合 .

    全外连接:完全外连接既不“左”也不“右” - 这两者都是!它包括参与JOIN的两个表或结果集中的所有行 . 当JOIN的“左”侧的行不存在匹配的行时,您会在“右侧”的结果集中看到Null值 . 相反,当JOIN的“右”侧的行不存在匹配行时,您会在“左侧”的结果集中看到Null值 .

  • 210

    对于SQL Server, CROSS JOIN and FULL OUTER JOIN 是不同的 . CROSS JOIN 只是两个表的笛卡尔积,不论任何过滤条件或任何条件 .

    FULL OUTER JOIN 给出了两个表的 LEFT OUTER JOIN and RIGHT OUTER JOIN 的唯一结果集 . 它还需要ON子句来映射两列表 .

    表1包含10行,表2包含20行,其中5行与特定列匹配 . 然后CROSS JOIN将在结果集中返回10 * 20 = 200行 . FULL OUTER JOIN将在结果集中返回25行 . FULL OUTER JOIN(或任何其他JOIN)始终返回小于或等于笛卡尔积数的结果集 . FULL OUTER JOIN返回的行数等于(LEFT OUTER JOIN的行数)(RIGHT OUTER JOIN的行数) - (INNER JOIN的行数) .

  • 52

    交叉加入:http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm

    TLDR:生成2个表之间的所有可能组合(Carthesian产品)

    (完整)外部加入:http://www.w3schools.com/Sql/sql_join_full.asp

    TLDR:返回bot表中的每一行,并匹配具有相同值的结果

  • 3

    嗨,除了返回的NULL值之外,它们是相同的概念 .

    见下文:

    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  t1.col1 = t2.col1
    
    /* RESULT
    col1        col2        col1        col2     
    ----------- ----------- ----------- ----------- 
    NULL        NULL        10          101
    2           22          2           202
    1           11          NULL        NULL
    
    (3 row(s) affected)
    */
    select  *
    from    @table1 t1 cross join @table2 t2
    
    /* RESULT 
    col1        col2        col1        col2        
    ----------- ----------- ----------- ----------- 
    1           11          10          101
    2           22          10          101
    1           11          2           202
    2           22          2           202
    
    (4 row(s) affected)
    */
    
  • 1

    全外连接:

    此连接组合左外连接和右外连接 . 它在满足条件时从任一表返回行,并在没有匹配时返回null值 .

    图片:(http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg

    交叉加入:

    此联接是笛卡尔联接,无需任何条件即可加入 . 结果集包含的记录是两个表中记录号的乘积 .

    图片:(http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg

  • 1

    下面是一个示例,其中FULL OUTER JOIN和CROSS JOIN都返回相同的结果集而不返回NULL . 请注意FULL OUTER JOIN的ON子句中的1 = 1:

    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

    SQL FULL OUTER JOIN

    • FULL OUTER JOIN返回左表(table1)和右表(table2)中的所有行,而不管匹配情况如何 .

    • FULL OUTER JOIN关键字组合了LEFT OUTER JOIN和RIGHT OUTER JOIN的结果

    • SQL全外连接也称为FULL JOIN

    参考:http://datasciencemadesimple.com/sql-full-outer-join/

    SQL CROSS JOIN

    • 在SQL CROSS JOIN中第一个表的每一行都映射到第二个表的每一行 .

    • CROSS JOIN操作的结果集生成的行数等于第一个表中的行数乘以第二个表中的行数 .

    • CROSS JOIN也称为笛卡尔积/笛卡尔连接

    • 表A中的行数是m,表B中的行数是n,结果表将有m * n行

    参考:http://datasciencemadesimple.com/sql-cross-join/

相关问题