2015-05-17 2 views
1

У меня есть решение на Java для простой задачи, но я хочу улучшить время, необходимое для выполнения обработки данных. Проблема состоит в том, чтобы взять ряд слов, хранящихся в столбце в реляционной базе данных, и разделить слова на пары, которые затем вставляются в словарь пар. Сами пары относятся к продукту, идентифицированному partid.Разделение пар из данных столбца в SQL Server

Следовательно, таблица часть имеет

PartID (int), PartDesc (nvarchar) 

и словарь имеет

DictID (int), WordPair (nvarchar). 

Логика поэтому:

insert into DictPair (wordpair, partid) 
select wordpairs, partid from Part 

wordpair определяется как два смежных слов и, следовательно, слова будет повторяться, например

red car with 4 wheel drive 

будет пара к

{red, car},{car, with}, {with,4}, {4, wheel}, {wheel, drive} 

Следовательно окончательный словарь для Say PartID 45 будет иметь (PartID, dictionarypair):

45, red car 
45, car with 
45, with 4 
45, 4 wheel 
45, wheel drive 

Это используется в классификации продуктов и, следовательно, вопросы порядка слов (но порядок пар не имеет значения).

Есть ли у кого-нибудь идеи о том, как это решить? Я думал о хранимых процедурах и использовал какой-то синтаксический анализ. Я хочу, чтобы все решение было реализовано в SQL по соображениям эффективности.

ответ

3

В принципе, найдите функцию split() в сети, которая возвращает позицию слова в строке.

Затем сделайте:

select s.word, lead(s.word) over (partition by p.partId order by s.pos) as nextword 
from parts p outer apply 
    dbo.split(p.partDesc, ' ') as s(word, pos); 

Это поставит NULL для последней пары, которые вы, кажется, не хотят. Итак:

insert into DictPair (wordpair, partid) 
    select word + ' ' nextword, partid, 
    from (select p.*, s.word, lead(s.word) over (partition by p.partId order by s.pos) as nextword 
      from parts p outer apply 
       dbo.split(p.partDesc, ' ') as s(word, pos) 
     ) 
    where nextword is not null; 

Here некоторые разделить функции, предоставляемые погуглить "раскол SQL Server". И another. И от StackOverflow. И есть еще много