我有两张桌子,Table1
和Table2
。
Table1
FullName
由格式中的名称列 ( )'FirstName LastName'
和唯一标识符 ( Key
) 组成。Table2
有一列 ( Name
) 由这些名称组成,但格式为'F. LastName'
.
我想Table2
用来自的唯一标识符 ( Key
)替换名称Table1
。这需要比较FullName
and中的字符串Name
(这种比较是双射的)。
这可以使用SQL吗?
您可以直接进行更新,但您有代码无法克服的问题。
create table table1 (
key integer primary key,
firstname varchar(20),
lastname varchar(20)
);
insert into "table1" values(1,'Ian','McCormick');
insert into "table1" values(2,'Irving','McCormick');
create table table2 (name varchar(30));
insert into table2 values('I. McCormick');
看到问题了吗?“Ian McCormick”和“Irving McCormick”都映射到“I. 麦考密克”。哪个身份证号码应该'I。麦考密克的结局是什么?没有办法说。
总之,小心更新。备份您的数据库。然后为 id 号添加一个新列。
alter table Table2
add column key integer;
现在,您可以更新新列,而不会冒旧列中的数据的风险。
update table2
set key = (select key
from table1
where name = substr(FirstName, 1, 1) || '. ' || LastName);
您也可以加入表达式。加入您打算在更新中使用的表达式是一个很好的第一步——它可以在为时已晚之前提醒您注意问题。此外,如下所示,它可以向您展示错误数据可能导致的大屠杀。
sqlite> select * from table1
...> inner join table2
...> on substr(FirstName, 1, 1) || '. ' || LastName = table2.name;
key firstname lastname name key
--
1 Ian McCormick I. McCormick 1
2 Irving McCormick I. McCormick 1
注意第二行的键不匹配。