使用空值连接列

时间:2012-11-16 15:00:17

标签: sql sql-server sql-server-2008 tsql

我有两个表(表A和表B),如下所示:

表A:

Col 1    Col 2
--------------
A        1
A        2
A        3
...
A        15
...

表B:

Col 3    Col 4
--------------
A        a
A        b

我想写一个查询将表B col 4连接到表A.表B col 3将匹配表A col 1,所以我想加入这个列。我要找的结果是:

表C:

Col 1    Col 2    Col 4
-----------------------
A        1        a
A        2        b
A        3        null
A        4        null
....
A        15       null
....

我尝试了以下内容:

select
    tableA.col1,
    tableA.col2,
    tableB.col4
from
    tableA
inner join tableB on tableA.col1 = tableB.col3

但这会产生结果:

Col 1    Col 2    Col 4
-----------------------
A        1        a
A        1        b
A        2        a
A        2        b
....
A        15       a
....

5 个答案:

答案 0 :(得分:3)

WITH A AS
(
SELECT *,
       ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col2) AS RN
FROM TableA
), B AS
(
SELECT *,
       ROW_NUMBER() OVER (PARTITION BY Col3 ORDER BY Col4) AS RN
FROM TableB
)
SELECT A.Col1, A.Col2, B.Col4
FROM A LEFT OUTER JOIN B ON A.Col1 = B.Col3 AND A.RN=B.RN

(SQL Fiddle)

答案 1 :(得分:0)

使用left join代替inner join

  • inner join仅加入匹配的行
  • left joinright join返回完整的左表或右表,其中包含来自第二个表的匹配行或空值
  • full join获取两个表中的所有行。

答案 2 :(得分:0)

像这样使用LEFT JOIN

SELECT 
        tableA.col1,
        tableA.col2,
        tableB.col4
    FROM tableA
    LEFT JOIN tableB on tableA.col1 = tableB.col3

答案 3 :(得分:0)

我认为您没有发布正确的查询和/或结果:
(我原以为)

Col 1    Col 2    Col 4
-----------------------
A        1        a
A        1        b
A        2        a
A        2        b
...

为了达到您想要的结果,无论奇怪和不寻常,您都需要为表B生成序列号以加入表A中的第2列。
我能想到的最简单的方法是使用子查询。

答案 4 :(得分:0)

将数据更改为选项吗?

Table A:

Col 1    Col 2
--------------
A        1
A        2
A        3
...
A        15
...
Table B:

Col 2    Col 4
--------------
1        a
2        b

SELECT tableA.col1, tableA.col2, tableB.col4
FROM tableA
LEFT JOIN tableB ON tableA.col2 = tableB.col2