如何基于一个表中的缺失值连接两个表?

时间:2013-11-01 06:18:11

标签: sql join sql-server-2012 records

道歉,如果这个问题早已得到回答。我找了但却找不到任何东西。

问题:

我正在使用SQL Server 2012,我有两个表(TableATableB),如下所示

表A

+-------+--------+
| ItemA | SeqNoA |
+-------+--------+
| D     |      1 |
| A     |      0 |
| Z     |      0 |
| B     |      4 |
| A     |      0 |
| K     |      6 |
+-------+--------+

表B

+-------+--------+
| ItemB | SeqNoB |
+-------+--------+
| A     |      1 |
| D     |      2 |
| C     |      3 |
| A     |      4 |
| B     |      5 |
| J     |      6 |
+-------+--------+

TableA的某些行SeqNo中缺少(零)值,而SeqNo的列TableB中存在相同的值。我需要找到一些方法来连接这些表,以便我最终得到以下给定的值。这个连接可以是某些种类的连接查询,也可以是基于这两个表创建一个全新的表

+-------+--------+-------+
| ItemA | SeqNoA | ItemB |
+-------+--------+-------+
| D     |      1 | A     |
| A     |      2 | D     |
| Z     |      3 | C     |
| B     |      4 | A     |
| A     |      5 | B     |
| K     |      6 | J     |
+-------+--------+-------+

2 个答案:

答案 0 :(得分:1)

SeqNoA列中的缺失值为0.如果表中没有主键,则可以通过在TableA中为每一行分配唯一的序列号来编写如下查询:

select TA.ItemA , TA.NewSeqNoA as SeqNoA , TB.ItemB 
from 
(
select ItemA, SeqNoA , ROW_NUMBER() over (order by (select 1)) as NewSeqNoA
from tableA ) TA
join tableB TB on TA.NewSeqNoA = TB.SeqNoB 

但是如果你在tableA中有一个主键,那么你可以像下面这样修改这个查询来给你正确的行号:

select TA.ItemA , TA.NewSeqNoA as SeqNoA , TB.ItemB 
from 
(
select ItemA, SeqNoA , ROW_NUMBER() over (order by ('TableA PK')) as NewSeqNoA
from tableA ) TA
join tableB TB on TA.NewSeqNoA = TB.SeqNoB 

答案 1 :(得分:0)

ON tableB.SeqNo = ISNULL(tableA.SeqNo,tableB.SeqNo)