zoukankan      html  css  js  c++  java
  • MSSQL Join的使用

    假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。

    id name             id  name
    -- ----             --  ----
    1  Pirate           1   Rutabaga
    2  Monkey           2   Pirate
    3  Ninja            3   Darth Vader
    4  Spaghetti        4   Ninja
    

    1、内联合(inner join)只生成同时匹配表A和表B的记录集。结果如下:

    SELECT * FROM TableA
    INNER JOIN TableB
    ON TableA.name = TableB.name
    
    id  name       id   name
    --  ----       --   ----
    1   Pirate     2    Pirate
    3   Ninja      4    Ninja
    

    2、全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。结果如下: 

    SELECT * FROM TableA
    FULL OUTER JOIN TableB
    ON TableA.name = TableB.name
    
    id    name       id    name
    --    ----       --    ----
    1     Pirate     2     Pirate
    2     Monkey     null  null
    3     Ninja      4     Ninja
    4     Spaghetti  null  null
    null  null       1     Rutabaga       
    null  null       3     Darth Vader
    

    3、左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。结果如下:

    SELECT * FROM TableA
    LEFT OUTER JOIN TableB
    ON TableA.name = TableB.name
    
    id  name       id    name
    --  ----       --    ----
    1   Pirate     2     Pirate
    2   Monkey     null  null
    3   Ninja      4     Ninja
    4   Spaghetti  null  null
    

    为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。结果如下:

    SELECT * FROM TableA
    LEFT OUTER JOIN TableB
    ON TableA.name = TableB.name
    WHERE TableB.id IS null
    
    id  name       id     name
    --  ----       --     ----
    2   Monkey     null   null
    4   Spaghetti  null   null
    

    4、右外联合(right outer join)生成表B的所有记录,包括在表A里匹配的记录。如果没有匹配的,左边将是null。结果如下: 

    SELECT * FROM TableA
    RIGHT OUTER JOIN TableB
    ON TableA.name = TableB.name

    id     name     id    name
    --    ----       --    ----
    null   null        1    Rutabaga
    1      Pirate     2    Pirate
    null   null        3    Darth Vader
    3      Ninja      4    Ninja

    5、为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。结果如下:

    SELECT * FROM TableA
    FULL OUTER JOIN TableB
    ON TableA.name = TableB.name
    WHERE TableA.id IS null 
    OR TableB.id IS null
    
    id    name       id    name
    --    ----       --    ----
    2     Monkey     null  null
    4     Spaghetti  null  null
    null  null       1     Rutabaga
    null  null       3     Darth Vader
    

    6、还有一种笛卡尔积或者交叉联合(cross join),这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。

    下表显示每种外部联接(outer join)匹配时保留数据行的情况:

    联接类型

    保留数据行

    A left outer join B

    all A rows

    A right outer join B

    all B rows

    A full outer join B

    all A and B rows

      

      

      

      

     

  • 相关阅读:
    平衡二叉树之RB树
    平衡二叉树之AVL树
    实现哈希表
    LeetCode Median of Two Sorted Arrays
    LeetCode Minimum Window Substring
    LeetCode Interleaving String
    LeetCode Regular Expression Matching
    PAT 1087 All Roads Lead to Rome
    PAT 1086 Tree Traversals Again
    LeetCode Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/tlduck/p/5945073.html
Copyright © 2011-2022 走看看