Заменить начальные слова - PullRequest
0 голосов
/ 18 июня 2010

У меня есть таблицы ниже.

tblInput

Id  WordPosition    Words
--  -----------     -----
1   1               Hi
1   2               How
1   3               are
1   4               you
2   1               Ok
2   2               This
2   3               is
2   4               me

tblReplacement

Id  ReplacementWords
--- ----------------
1   Hi
2   are
3   Ok
4   This

tblInput содержит список слов , в то время как tblReplacement содержит слова, которые нам необходимо найти в tblInput , и если совпадение найдено, нам нужно заменить их.

Но проблема в том, что нам нужно заменить эти слова, если в начале будет найдено какое-либо совпадение.

, то есть в tblInput,

в случае идентификатора 1 , слова, которые будут заменены, - это только 'Hi' and not 'are'

, поскольку, прежде чем 'are', 'How' есть и его нет в списке tblReplacement.

в случае Id 2, слова, которые будут заменены: 'Ok' & 'This'.Поскольку оба эти слова

присутствуют в таблице tblReplacement и после первого слова, т.е. 'Ok' заменено

, второе слово 'This' здесь стоит первым в списке

ID категории 2

.Так как он доступен в tblReplacement и теперь является первым словом, то он также будет заменен на

.

Таким образом, желаемый результат будет

Id  NewWordsAfterReplacement
--- ------------------------
1   How
1   are
1   you 
2   is
2   me

Myпока подход:

;With Cte1 As(
Select 
    t1.Id
    ,t1.Words
    ,t2.ReplacementWords
From tblInput t1 
Cross Join tblReplacement t2)
,Cte2 As(
Select Id, NewWordsAfterReplacement = REPLACE(Words,ReplacementWords,'')
From Cte1)

Select * from Cte2 where NewWordsAfterReplacement <> ''

Но я не получаю желаемый результат.Он заменяет все подходящие слова.

Требуется срочная помощь **. (УСТАНОВЛЕНО) **

Я использую SQL Server 2005.

Спасибо

1 Ответ

0 голосов
/ 18 июня 2010

Я не могу точно понять ваше требование. Но из того, что я понимаю, это работает для данных

with cte1 as(
select 1 as id,   1 as wp, 'Hi' as words union all
select 1,  2       ,        'How' union all
select 1 ,  3   ,            'are' union all
select 1 ,  4   ,            'you' union  all
select 2 ,  1       ,        'Ok' union all
select 2 ,  2 ,              'This' union all
select  2 ,  3   ,            'is' union all
select 2 ,  4       ,        'me'
),
 cte2 as(
select 1 as id,  'Hi' as rep union all
select 2 ,  'are' union all
select 3 ,  'Ok' union all
select 4  , 'This')

select ID,words from cte1
except
select ID,words from(
select a.id,a.words,a.wp,RANK() over(partition by a.id order by wp) as rnk
from cte1 as a inner join
cte2 as b on a.words=b.rep
) as x
where x.wp=x.rnk
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...