将2个源表中的非空列更新为目标表的空列

时间:2018-05-21 18:46:17

标签: sql

我有桌子A

ID|POS|Location|ITEM    |COLOR
------------------------------
1 | 1 |ABC     |A       | RED
1 | 2 |ABC     |B       | BLUE
1 | 3 |ABC     |NULL    | YELLOW
1 | 4 |ABC     |D       | NULL
2 | 1 |ABC     |A       | BLACK
2 | 2 |ABC     |B       | BLUE
2 | 3 |ABC     |C       | RED
3 | 1 |ABC     |NULL    | BROWN
4 | 1 |ABC     |A       | WHITE
4 | 2 |ABC     |B       | RED  
4 | 3 |ABC     |NULL    | BLUE 
4 | 4 |ABC     |NULL    | YELLOW
5 | 1 |ABC     |A       | NULL
5 | 2 |ABC     |C       | NULL
5 | 3 |ABC     |D       | BLUE
6 | 1 |ABC     |A       | RED
6 | 2 |ABC     |B       | BROWN
6 | 3 |ABC     |C       | WHITE
7 | 1 |ABC     |NULL    | RED 
7 | 2 |ABC     |B       | NULL
7 | 3 |ABC     |C       | YELLOW
8 | 1 |ABC     |A       | NULL
8 | 2 |ABC     |B       | BLACK
8 | 3 |ABC     |C       | BLUE
8 | 4 |ABC     |D       | RED
8 | 5 |ABC     |E       | BROWN
9 | 1 |ABC     |NULL    | WHITE
9 | 2 |ABC     |C       | BLUE
9 | 3 |ABC     |D       | YELLOW
9 | 4 |ABC     |E       | NULL
10 | 1 |ABC     |A       | NULL
10 | 2 |ABC     |B       | WHITE
10 | 3 |ABC     |C       | BLACK
11 | 1 |ABC     |A       | BLUE
11 | 2 |ABC     |B       | NULL

表B

ID|POS|Location|ITEM    
1 | 1 |ABC     |A       
1 | 2 |ABC     |B       
1 | 3 |ABC     |B       
1 | 4 |ABC     |D       
2 | 1 |ABC     |A       
2 | 2 |ABC     |B       
2 | 3 |ABC     |C       
3 | 1 |ABC     |E       
4 | 1 |ABC     |A       
4 | 2 |ABC     |B       
4 | 3 |ABC     |F       
4 | 4 |ABC     |NULL    
5 | 1 |ABC     |A       
5 | 2 |ABC     |C       
5 | 3 |ABC     |NULL      
6 | 1 |ABC     |A       
6 | 2 |ABC     |B   

和表C

ID|POS|Location   |COLOR
--------------------------
1 | 1 |ABC        | RED
1 | 2 |ABC        | BLUE
1 | 3 |ABC        | YELLOW
1 | 4 |ABC        | RED
2 | 1 |ABC        | BLACK
2 | 2 |ABC        | BLUE
2 | 3 |ABC        | VIOLET
3 | 1 |ABC        | BROWN
4 | 1 |ABC        | WHITE
4 | 2 |ABC        | RED
4 | 3 |ABC        | BLUE 
4 | 4 |ABC        | YELLOW
5 | 1 |ABC        | WHITE 
5 | 2 |ABC        | BLACK
5 | 3 |ABC        | BLUE 
6 | 1 |ABC        | RED  
6 | 2 |ABC        | BROWN
6 | 3 |ABC        | WHITE
7 | 1 |ABC        | RED  
7 | 2 |ABC        | BLUE 
7 | 3 |ABC        | YELLOW
8 | 1 |ABC        | PURPLE 
8 | 2 |ABC        | BLACK
8 | 3 |ABC        | PINK 
8 | 4 |ABC        | RED  
8 | 5 |ABC        | BROWN
9 | 1 |ABC        | WHITE
9 | 2 |ABC        | BLUE 
9 | 3 |ABC        | YELLOW
9 | 4 |ABC        | NULL 
10 | 1 |ABC        | CYAN
10 | 2 |ABC        | WHITE
10 | 3 |ABC        | BLACK
11 | 1 |ABC        | INDIGO
11 | 2 |ABC        | NULL 

我想复制表B中的Items列(非空项)和表C中的Colors列(非空颜色),只有当Item列为null或表A中的颜色项为null时才将它们更新到表A中。

谢谢,

1 个答案:

答案 0 :(得分:0)

看起来你的钥匙是ID和POS?如果您使用的是sql server,则可以使用case语句

执行此操作
UPDATE a
set 
   item = CASE WHEN b.item is not null then b.item else a.item END,
   color = CASE WHEN c.color is not null then c.color else a.color END
FROM TableA a
INNER JOIN TableB b
on a.ID = b.ID and a.POS = b.POS
INNER JOIN TableC c
on a.ID = c.ID and a.POS = c.POS