Мне нужен оператор SQL, который заполняет нулевые значения из второго столбца таблицы # T1 значениями из # T2 (C1).
Нет внешнего ключа или совпадения между столбцами этих двух таблиц.
Пример:
T1 (C1, T2C1)
A1, 1
A2, null
A3, null
A4, 4
A5, null
-------------
T2 (C1)
a
b
После обновления T1 будет выглядеть так:
A1, 1
A2, a
A3, b
A4, 4
A5, null
Я нашел два подхода:
Использование CTE
create table #T1 (C1 varchar(10), T2C1 varchar(10))
create table #T2 (C1 varchar(10))
insert into #T1 values ('A1', '1')
insert into #T1 values ('A2', null)
insert into #T1 values ('A3', null)
insert into #T1 values ('A4', '4')
insert into #T1 values ('A5', null)
insert into #T2 values ('a')
insert into #T2 values ('b')
;with t2 as
(
select C1, row_number() over (order by C1) as Index2
from #T2
)
,t1 as
(
select T2C1, row_number() over (order by C1) as Index1
from #T1
where T2C1 is null
)
update t1
set t1.T2C1 = t2.C1
from t2
where t1.Index1 = t2.Index2
select * from #T1
drop table #T1
drop table #T2
с производными таблицами
create table #T1 (C1 varchar(10), T2C1 varchar(10))
create table #T2 (C1 varchar(10))
insert into #T1 values ('A1', '1')
insert into #T1 values ('A2', null)
insert into #T1 values ('A3', null)
insert into #T1 values ('A4', '4')
insert into #T1 values ('A5', null)
insert into #T2 values ('a')
insert into #T2 values ('b')
update #T1
set T2C1 = cj.C1
from #T1
join (select T2C1, row_number() over (order by C1) as Index1, C1
from #T1
where T2C1 is null) ci on ci.C1 = #T1.C1
join (select C1, row_number() over (order by C1) as Index2
from #T2) cj on ci.Index1 = cj.Index2
select * from #T1
drop table #T1
drop table #T2
У меня вопрос, могу ли я достичь этого без использования оконных функций и без курсоров?
Обновление
@Damien_The_Unbeliever правильно указывает на то, что выполнить такого рода обновление невозможно без определения порядка в таблицах, на самом деле я думаю, что в точности сказано, что нет правильной идентификации и связи строк из целевой таблицы.
@ Богдан Sahlean нашел другой способ, используя переменные таблицы и столбец IDENTITY, и я доволен этим решением, это другой способ
Тем не менее, в реальном приложении я все еще буду использовать функции управления окнами
Спасибо всем