SQL联接两个表并显示表A的所有行

时间:2018-06-19 23:28:05

标签: sql sql-server

我对JOIN有疑问。

     TABLE A      |        TABLE B       |
-----------------------------------------|
    PK   |   div  |   PK   |  div  | val |
-----------------------------------------|
     A   |   a    |    1   |   a   |  10 |
     B   |   b    |    2   |   a   | 100 |
     C   |   c    |    3   |   c   |  9  |
------------------|    4   |   c   |  99 |
                  -----------------------

有两个类似上面的表,我一直试图连接两个表,但是我想查看TABLE A中的所有行。

类似

SELECT T1.PK, T1.div, T2.val 
    FROM A T1 
    LEFT OUTER JOIN B T2 
        ON T1.div = T2.div

我希望结果如下所示。

   PK   |  div  |  val  |
-------------------------
   A    |   a   |  10   |
   A    |   a   |  100  |
   B    |  null |  null |
   C    |   c   |   9   |
   C    |   c   |   99  |

我已经尝试了所有我知道的JOIN,但是B因为它不存在而没有出现。是否可以显示TABLE A上的所有行,如果null上不存在TABLE B呢?

谢谢!

2 个答案:

答案 0 :(得分:1)

要进入结果集,您需要做的就是使用T2.Div,因为第二个表中不存在该值:

SELECT T1.PK, T2.div, T2.val 
FROM A T1 
LEFT OUTER JOIN B T2 
    ON T1.div = T2.div

答案 1 :(得分:1)

如果您将查询更改为

SELECT T1.PK, T2.div, T2.val 
    FROM A T1 
    LEFT OUTER JOIN B T2 
        ON T1.div = T2.div

(请注意,div来自此处的T2。),您将获得准确的发布结果(但可能以不同的顺序,如果需要,可以添加ORDER BY子句一个特定的订单)。

您当前的查询将为您提供

   PK   |  div  |  val  |
-------------------------
   A    |   a   |  10   |
   A    |   a   |  100  |
   B    |   b   |  null |
   C    |   c   |  9    |
   C    |   c   |  99   |

(请注意,divb的{​​{1}}而不是PK的行的B。)