2

我有两张桌子,Table1Table2

Table1FullName由格式中的名称列 ( )'FirstName LastName'和唯一标识符 ( Key) 组成。Table2有一列 ( Name) 由这些名称组成,但格式为'F. LastName'.

我想Table2用来自的唯一标识符 ( Key)替换名称Table1。这需要比较FullNameand中的字符串Name(这种比较是双射的)。

这可以使用SQL吗?

4

1 回答 1

2

您可以直接进行更新,但您有代码无法克服的问题。

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

注意第二行的键不匹配。

于 2013-09-06T01:41:50.143 回答