Как объединить две таблицы на основе пропущенных значений в одной таблице?
Извиняюсь, если на этот вопрос уже был дан ответ ранее. Я охотился, но не мог найти ни одного.
Эта проблема:
Я использую 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