2012-08-07 86 views
3

我是一般的SQL新手,甚至是MS SQL的新手。我很抱歉,如果標題不清楚我想要什麼。sql server將兩個表中的值組合在一起

我有兩張表我想從新表中導出數據的舊錶。這些表具有完全相同的列但行數不同。新表格具有舊錶格中每個值的多個副本,其中只有2個副本。見下面兩欄比較:字母和數量。

新表:

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' s被設置爲12)。

+2

在SQL數據沒有訂單,除非你有一個'ORDER BY'條款,要求數據做的排序。在你的情況下,你有三個'A'記錄'0',沒有其他區分因素。你如何明確知道哪條記錄應該加入哪條記錄?你能修改你的數據來使用'IDENTITY'添加一個'id'列嗎?另外,您正在使用哪個版本的SQL Server? – MatBailie 2012-08-07 16:27:46

+1

我使用的是2008.我有一個ID,它是在新表中發生的次數相同。 – Jabda 2012-08-07 16:43:16

+0

這些桌子上的鑰匙是什麼?從它的外觀來看,你正在把一些相當簡單的東西變成噩夢。 A的首次出現取決於您選擇它們​​的順序...... – 2012-08-07 16:58:41

回答

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 
+0

結果正是我想要的,你能解釋一下「;用CTE作爲(select *,ROW_NUMBER()over(由col1按col1分區)作爲從@ test1)「所以我可以嘗試在實際的表 – Jabda 2012-08-07 16:49:37

+0

在這裏,我通過col1進行分區,以便它將分配每個分區中的序列號。然後,我將更新它的1與來自其他表的值。如果它有用的你可以接受答案。 – AnandPhadke 2012-08-07 16:52:48

+1

最終這是最容易翻譯成我的圖書館工作完美謝謝 – Jabda 2012-08-07 18:43:07

2

click here to see Demo

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 
相關問題