道歉,如果这个问题早已得到回答。我找了但却找不到任何东西。
问题:
我正在使用SQL Server 2012,我有两个表(TableA
和TableB
),如下所示
表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 |
+-------+--------+-------+
答案 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)