Если вам нужны отдельные слова в вашем имени, то, возможно, наличие таблицы, в которой ваше имя - только одна строка, не является оптимальным с точки зрения концепции.Кроме того, разделение имен теперь является болезненным, поскольку у вас нет повторяющихся шаблонов для ваших отчеств.Плюс модификация строки на самом деле не является сильной стороной SQL.Вместо этого я бы расширил ваш стол примерно так:
alter table tb100
add
nameID int IDENTITY(1,1) NOT NULL,
first_name varchar(50) null,
middle_name varchar(50) null,
last_name varchar(50) null
insert into tb100 values('Mak John'),('Will Smith'),('Luke W')......100 rows.
if (SELECT LEN(col) - LEN(REPLACE(col, ' ', '')) > 1)
update tb100
set
first_name = (Select Substring(name, 0, (Charindex(' ', name)))),
middle_name = (Select Substring( Right(name, (LEN(name) - (Charindex(' ', name) +1)), 0, (Charindex(' ', name)))),
last_name = (select Substring( Right(middle_name, (LEN(middle_name) - (Charindex(' ', middle_name) + 1)), LEN(LEN(middle_name) - (Charindex(' ', middle_name) + 1))
else
update tb100
set
first_name = (Select Substring(name, 0, (Charindex(' ', name)))),
middle_name = '',
last_name = (Select Substring( Right(name, (LEN(name) - (Charindex(' ', name) +1)), 0, (Charindex(' ', name))))
Надеюсь, это сработает, у меня не было возможности протестировать его, потому что я в дороге.Если у вас есть возможность вставить данные в эти столбцы без всей этой модификации, сделайте это.Затем вы делаете то же самое с вашим другим столом ...
alter table tb50mil
add
nameID int IDENTITY(1,1) NOT NULL,
first_name varchar(50) null,
middle_name varchar(50) null,
last_name varchar(50) null
insert into tb10mil values('John A Mak'),('K Smith Will'),('James Henry')......50 million rows.
if (SELECT LEN(col) - LEN(REPLACE(col, ' ', '')) > 1)
update tb50mil
set
first_name = (Select Substring(name, 0, (Charindex(' ', name)))),
middle_name = (Select Substring( Right(name, (LEN(name) - (Charindex(' ', name) +1)), 0, (Charindex(' ', name)))),
last_name = (select Substring( Right(middle_name, (LEN(middle_name) - (Charindex(' ', middle_name) + 1)), LEN(LEN(middle_name) - (Charindex(' ', middle_name) + 1))
else
update tb50mil
set
first_name = (Select Substring(name, 0, (Charindex(' ', name)))),
middle_name = '',
last_name = (Select Substring( Right(name, (LEN(name) - (Charindex(' ', name) +1)), 0, (Charindex(' ', name))))
и с этого момента это действительно простое соединение:
select * from tb100 hun
inner join
tb50mil mil on hun.first_name = mil.first_name OR hun.middle_name = mil.middle_name OR hun.last_name OR mil.last_name
Надеюсь, это поможет!