Как объединить две таблицы на основе пропущенных значений в одной таблице?

Извиняюсь, если на этот вопрос уже был дан ответ ранее. Я охотился, но не мог найти ни одного.

Эта проблема:

Я использую SQL Server 2012 и у меня есть две таблицы (TableA а также TableB) как показано ниже

Таблица А

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

TableB

+-------+--------+
| 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 ответа

Пропущенные значения в столбце 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 

но если у вас есть первичный ключ в таблице A, то вы можете изменить этот запрос, как показано ниже, чтобы получить правильный номер строки:

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 
ON tableB.SeqNo = ISNULL(tableA.SeqNo,tableB.SeqNo)
Другие вопросы по тегам