2010-06-18 157 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