2010-06-18 77 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認爲我們需要在tblInput搜索詞 一個d如果找到匹配,那麼我們需要替換 那些。

但問題是,如果在開始時發現任何匹配,我們需要替換這些詞。

即,在tblInput,

在ID 1的情況下,將被替換的字是唯一'Hi'and not 'are'

因爲之前「是」,「如何」是存在的,它不在tblReplacement列表中。

在Id 2的情況下,將被替換的字詞是'Ok' & 'This'。由於這些都

話是存在於tblReplacement表的第一個字即「確定」

更換,第二個字是「這」這裏首先出現的

列表

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

但我沒有得到期望的輸出。它取代了所有的匹配詞。

迫切需要幫助**。(基於集)**

我使用SQL Server 2005的

感謝

+1

您一直在問這個問題或其中的輕微變化......我幾乎傾向於重複關閉。另外:你正在處理**字符串操作** - 這是**不**你可以以基於集合的方式做的事情 - 你需要擺弄字符串 - 沒有任何基於此的設置(和不方法來做到這一點「基於集合」)。使用CTE(WITH .....)就像你可以做的那樣基於set-based - 再一次:你究竟是什麼**真的**想要? – 2010-06-18 05:13:42

回答

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 2010-06-18 04:10:18