我有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
答案 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
。
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