我需要一个SQL语句,它使用来自#T2(C1)的值填充#T1表的第二列的空值。当它们之间没有关系时,两个表之间的更新
这两个表的列之间没有外键或匹配。
样品:
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正确指出,要做到这种更新是不可能不定义对表进行排序,其实我觉得确切的说是不正确识别和目标表链接行。
@Bogdan Sahlean已经找到另一种方式,使用表变量和IDENTITY列,这是我很高兴与此解决方案,这是另一种方式 然而,在实际应用中我还是会使用窗口函数
感谢所有
表格没有固有的排序,而您正试图强加一个。没有窗口函数或游标,我不明白你会怎么做。 –
我与这个事实生活在一起,也许我错过了一些东西,我知道这些表格之间的唯一连接将是一个笛卡尔产品,N x M,其中M> 1 –