SQL Server 合并两个表的值

3

我是一个新手,对SQL不太熟悉,甚至对MS SQL更加陌生。如果标题没有清楚表达我的意思,我表示道歉。

我有两个表格,一个旧表和一个新表。我想从旧表中提取数据到新表中。这两个表格具有完全相同的列,但行数不同。新表中有多个旧表中每个值的副本,而旧表中仅有2个出现次数。请参见下面两列letter和amount的比较:

新表:

A  0 
A  0
A  0
B  0
B  0

旧表格:

A  12
A  0
B  10
B  0
C  23

我希望实现的是将旧表中金额列的值添加到新表中每个字母的第一次出现中,格式如下:
A  12 
A  0
A  0
B  10
B  0

内连接会导致所有的值都被填充 (因此所有的 A 都设置为 12)。


2
在SQL中,数据除非使用“ORDER BY”子句进行排序,否则不具有顺序,这需要利用数据进行排序。在您的情况下,您有三个带有0和没有其他区别因素的“A”记录。您如何明确知道哪个记录应连接到哪个其他记录?您能否修改您的数据以添加一个使用IDENTITY的“id”列?此外,您使用的是哪个版本的SQL Server? - MatBailie
1
我正在使用2008版本。我有一个ID,它在新表中出现的次数相同。 - Jabda
这些表格上的关键是什么?从外观上看,你正将本应相当简单的事情变成了噩梦。 A 的第一次出现都取决于您选择它们的顺序... - Tony Hopkinson
请告诉我们表的完整结构。如果不知道它们,我们就无法提供帮助。 - Tony Hopkinson
1
@TonyHopkinson,因此我在专家论坛上询问,寻求友好的建议 :) - Jabda
2个回答

2

试试这个:

DECLARE @test1 TABLE(col1 varchar(2),idn int)
insert into @test1
VALUES('A',0),
('A',0),
('A',0),
('B',0),
('B',0)

DECLARE @test2 TABLE(col1 varchar(2),idn int)
insert into @test2
VALUES('A',12),
('A',0),
('B',10),
('B',0),
('C',23)


;WITH CTE as (select *,ROW_NUMBER() over (partition by col1 order by col1) as rn from @test1)

update c SET c.idn=b.idn
from CTE c inner join (select col1,SUM(idn) as idn from @test2
group by col1) b
on c.col1 = b.col1 
where c.rn=1

select * from @test1

结果正是我想要的,您能解释一下 " ;WITH CTE as (select *,ROW_NUMBER() over (partition by col1 order by col1) as rn from @test1)" 吗?这样我就可以在实际表上尝试它了。 - Jabda
这里我按col1进行分区,以便在每个分区中分配序列号。然后我将更新其中为1的值,使用其他表中的值。如果有用的话,您可以接受这个答案。 - AnandPhadke
1
最终这是最容易翻译成我的库的,完美地工作了。谢谢! - Jabda

2

点击此处查看演示

declare @t table
(
    val varchar(2),
    digit int
)

insert into @t(val, digit)values('A', 0)
insert into @t(val, digit)values('A', 0)
insert into @t(val, digit)values('A', 0)
insert into @t(val, digit)values('B', 0)
insert into @t(val, digit)values('B', 0)

declare @t1 table
(
    val varchar(2),
    digit int
)

insert into @t1(val, digit)values('A', 12)
insert into @t1(val, digit)values('A', 0)
insert into @t1(val, digit)values('B', 10)
insert into @t1(val, digit)values('B', 0)
insert into @t1(val, digit)values('C', 23)


Select k.val, isNull(sum(k.digit + k1.digit), 0) as Digit from 
(
    Select ROW_NUMBER() over(partition by val order by val) as rowid, * from @t
)K
Left Join
(
    Select ROW_NUMBER() over(partition by val order by val) as rowid, * from @t1
)K1
on k.val = k1.val AND K.rowid = K1.rowid
group by k.val, K.rowid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接