2017-07-27 41 views
0

我有兩個表(A和B)。我想用表B的值col3_B更新col3_A。Col3_B的值是按順序排列的。所以Col3_A必須按照col3_B的順序更新。如何在表互不相關時從另一個表中依次更新表列的值

表A:

+--------+--------+--------+ 
| col1_A | col2_A | col3_A | 
+--------+--------+--------+ 
| A  |  1 | 5  | 
| B  |  1 | 3  | 
| C  |  1 | 2  | 
| D  |  1 | 1  | 
+--------+--------+--------+ 

表B:

+--------+ 
| col3_B | 
+--------+ 
|  6 | 
|  7 | 
|  8 | 
|  9 | 
+--------+ 

所需的結果:

+--------+--------+--------+ 
| col1_A | col2_A | col3_A | 
+--------+--------+--------+ 
| A  |  1 |  6 | 
| B  |  1 |  7 | 
| C  |  1 |  8 | 
| D  |  1 |  9 | 
+--------+--------+--------+ 

問題我的代碼只設置從col3_B前兩個值都col3_A列,只有兩個值重複如

+--------+ 
| Col3_A | 
+--------+ 
|  6 | 
|  7 | 
|  6 | 
|  7 | 
+--------+ 

我的代碼:

update A 
set A.col2_A = '1', A.col3_A = B.col3_B 
from (select ROW_NUMBER() OVER (ORDER BY [col] ASC) AS col3_B 
from tableb) B 
where A.col1_A in 
(
'A', 
'B', 
'C', 
'D' 
) 

回答

1

你可以試試下面的選項,因爲well.Make肯定的方式,我們訂購的記錄是正確的,雖然自從我這樣做

我不知道的業務邏輯
with temp as 
(
    select col1_a,col2_a,col3_a , 
    row_number() over(order by col2_a) as rn 
    from tablea 
), 
temp1 as 
( 
    select col3_b ,row_number() over(order by col3_b) as rn 
    from tableb 
) 
select temp.col1_a,temp.col2_a,temp.col3_a,temp.rn,temp1.col3_b 
into #tt 
from temp join temp1 
on temp.rn=temp1.rn; 

update tablea 
set col3_a=(select tt.col3_b from #tt tt where tt.col3_a=tablea.col3_a) 
+0

order by如果記錄沒有排序,col2_a和col3_b的排序可能會成爲問題。我更喜歡上面的解決方案,其中您創建了副本並更新了副本。通過這種方式,我們可以測試副本表並確保更新是正確的,然後將其推送到主表 – Aparna

0

添加獨特的無既表1和表2,然後更新基於Table表2。

現在更新將

update table1 
set col3_a=(select col3_b from tableb where a.unqiueid=b.uniqueid); 

由於col3_a是一個性格和col3_b是一個整數,我們需要確保它不會影響別的

創建一個唯一的ID列按照下面步驟

步驟1:創建表的副本的使用下面的查詢:

create table table1_cp 
(
    unique_id integer identity(1,1) primary key, 
    col1_A varchar(25), 
    col2_a varchar(100), 
    col3_a varchar(100) 
); 

步驟2:將來自table1的記錄到CP表

select * into table1_cp from table1; 

3步:現在你可以看到table1_cp具有獨特的ID自動填充。現在掉落表1

後改名爲tabl1_cp表1
drop table table1; 
sp_rename('table_cp','table1'); 

步驟4:重複表B相同,以及通過創建一個複製表添加idnetity列,然後插入記錄形成原始表和最後重命名

這應該使用只是FO表[R更新目的或唯一標識記錄 希望這有助於

+0

我編輯了我的問題col3_A和col3_b這兩列都是varchar。 我是否還需要添加唯一號碼,如果是,那麼如何添加唯一號碼? 將唯一編號用於所有行,或者它可以僅應用於篩選結果集。例如,如果我想過濾哪裏A.col1_A在 ( 'A', 'B', 'C', 'd' ) 應該唯一編號數被應用到含A,B.C.D行。 請諮詢更多解釋如何實現這個獨特的數字? – shaadi

+0

我已經添加了如何創建唯一標識符的步驟。查詢將適用於Microsoft SQL Server,但是如果您使用的是不同的數據庫,則必須創建一個序列對象並將其與表關聯起來,因爲只有sql server具有身份財產 – Aparna

+0

Apama感謝您的解釋。我對兩個生產表運行此查詢。我無法通過添加唯一標識來更改生產表的模式,因爲它會使應用程序崩潰。還有其他選擇嗎? – shaadi

相關問題