使用另一个表列中的值更新和替换一个表列中的值

时间:2018-11-06 21:27:04

标签: sql sql-server

我有2张桌子:

SLEEP_TIME_ON_FAILURE = 5  # Time to keep the connection open in case of failure

SOCKET_TIMEOUT = 15  # Socket timeout for inherited socket

我想用bsi匹配两个表的另一个表中的另一个列的数据替换单元格值

这是我的第二张桌子:

id | bsi | cell 

1  | 45 | NULL
2  | 23 | 600-1167
3  | 47 | 
4  | 89 | 501- -
5  | 98 | 603-5670

我希望将第一个表中的每个值替换为第二个表中的新值,并将两个表在bsi代码中匹配的值替换,即一旦存在一个,则用新值替换NULL和'501--'第二张桌子。

因此结果应为如下所示的更新表:

id | bsi | contact 

1  | 45 | 610-5896 
2  | 23 | 605-4567 
3  | 47 | NULL 
4  | 89 | 689-9089
5  | 98 | NULL

我尝试了此查询,但是它仅替换了新值,并且似乎为table1中的项目而不是table2中的项目写入了空值。我想保留表1中的table1值,而不是表2中的值。

id | bsi | cell 

1  | 45 | 610-5896
2  | 23 | 605-4567
3  | 47 | NULL
4  | 89 | 689-9089
5  | 98 | 603-5670

2 个答案:

答案 0 :(得分:1)

您的加入似乎有点困难...您没有加入第二张桌子

UPDATE t1
   SET t1.cell = t2.Contact
   FROM Table1  t1
   INNER JOIN Table2 t2 ON           --changed to table2
   t1.bsi = t2.bsi 
   --where <some condition>

此外,仅更新所有行比使用where clause进行选择要快。 See Aaron Bertrand's tests on this.之所以如此,是因为尽管您指出我想保留表1中的table1值,而不是表2 ,但这并未反映在您的预期输出中。如果确实要有条件地更新它们,则需要添加where clause

SEE DEMO HERE

create table table1 (id int, bsi int, cell varchar(16))

create table table2 (id int, bsi int, contact varchar(16))

insert into table1 values
(1,45,NULL),
(2,23,'600-1167'),
(3,47,''), 
(4,89,'501- -')

insert into table2 values
(1,45,'610-5896'), 
(2,23,'605-4567'), 
(3,47,NULL), 
(4,89,'689-9089')

UPDATE t1
   SET t1.cell = t2.Contact
   FROM Table1  t1
   INNER JOIN Table2 t2 ON           --changed to table2
   t1.bsi = t2.bsi 
   --where <some condition>


select * from table1

退货

+----+-----+----------+
| id | bsi |   cell   |
+----+-----+----------+
|  1 |  45 | 610-5896 |
|  2 |  23 | 605-4567 |
|  3 |  47 |          |
|  4 |  89 | 689-908  |
+----+-----+----------+

答案 1 :(得分:0)

看起来您的查询正在重新加入自身。将要加入的表改为Table2。

这只会更新bsi值将Table1中的行与Table2中的行匹配,并将单元格值设置为Contact

更新表1        SET Table1.cell = Table2.Contact        从表1
             内联接表2        开启Table1.bsi = Table2.bsi