2010-06-18 2 views
0

У меня есть следующие таблицы.Заменить начальные слова

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держать слова , что нам нужно искать в tblInputd, если совпадение найдено, тогда нам нужно заменить тех.

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

т.е. в tblInput,

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

, поскольку до «являются», «как» есть и не в списке tblReplacement.

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

слова присутствуют в таблице tblReplacement и после первого слова, т.е. «Ok» является

заменен, второе слово, которое «Это» здесь приходит первым в списке

ID категории 2

. Поскольку это доступно в tblReplacement, и это первое слово сейчас, то это будет

также можно заменить.

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

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

Мой подход до сих пор:

;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 <> '' 

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

Экстренная помощь необходима **. (SET БАЗЕ) **

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

Благодаря

+1

Вы снова и снова задавали этот вопрос или некоторые его варианты .... Я почти склонен к тому, чтобы закрыть как дубликат. Кроме того: вы имеете дело с ** строковыми манипуляциями ** - это ** НЕ ** что-то, что вы можете сделать с помощью набора, - вам нужно играть со строками - нет ничего основанного на этом (и нет способ сделать это «на основе набора»). Использование CTE (WITH .....) примерно так же основано на настройке, как вы можете быть - так еще раз: что на самом деле вы ** ДЕЙСТВИТЕЛЬНО ** хотите ??? –

ответ

0

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

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 
+0

, тогда решение, которое я предложил, должно работать - вам нужно будет изменить имена столбцов и т. Д. – josephj1989

Смежные вопросы