2015-01-14 3 views
1

SQL Server 2014를 사용하고 있습니다.SQL 업데이트 문제 - 단일 값을 여러 번 업데이트

이 테이블이 있습니다. T1이라고 말하십시오. 단 2 열.

RecID Desc 
----------------------------------------------- 
5  An apple a day keeps the doctors away. 

그리고 다른 테이블 말 T2 :

내가

이가 (즉, "사과"& "의사"의) T2에 관련된 단어를 제거하는 T1.Desc을 업데이트 할

RecID_FK Word 
-------------------------- 
    5  apple 
    5  doctors 

내 SQL :

UPDATE A 
SET A.Desc = LTRIM(RTRIM(REPLACE(' ' + A.Desc + ' ',' ' + B.Word + ' ', ' '))) 
FROM T1 As A 
INNER JOIN T2 As B ON A.RecID = B.RecID_FK 

이것은 잘 작동하지 않습니다.

"사과"는 제거되지만 "의사"는 여전히 있습니다.

이 문제를 해결하려면 올바른 SQL을 제공해 주시겠습니까?

답변

1

당신은 여기

이 모든 단어

마지막 문장을 교체까지 재귀 CTE는 설명에 업데이트 단어를 유지

재귀 CTE를 사용하는 또 하나의 방법입니다 cursor 또는 while loop을 사용하여 할 필요가 모든 단어가 대체되는 곳은 표를 업데이트하는 데 사용됩니다.

;with cte 
as 
(select RecID_FK, word, 
    ROW_NUMBER() over (partition by recID_FK order by (select null)) as rn, 
    COUNT(*) over (PARTITION by recID_FK) as cnt 
    from t2 

) 
,cte1 
as 
(select recid , LTRIM(RTRIM(REPLACE(' ' + t1.[Desc] + ' ',' ' + cte.Word + ' ', ' '))) as [Desc] , 2 as n, cnt 
    from t1 
    join cte 
    on t1.RecID = cte.RecID_FK 
    and cte.rn =1 
    union all 
    select recid, LTRIM(RTRIM(REPLACE(' ' + cte1.[Desc] + ' ',' ' + cte.Word + ' ', ' '))) , n+1, cte.cnt 
    from cte1 
    join cte 
    on cte1.recID = cte.RecID_FK 
    and cte.rn = n 
) 
update t1 
set [Desc] = cte1.[desc] 
from t1 
join cte1 
on cte1.RecID = t1.RecID 
and cte1.n = cte1.cnt +1 
1

첫 번째 조인 일치. 사용해보기 :

while @@ROWCOUNT > 0 
    begin 
     UPDATE A 
     SET A.Desc = LTRIM(RTRIM(REPLACE(' ' + A.Desc + ' ',' ' + B.Word + ' ', ' '))) 
     FROM T1 As A 
     INNER JOIN T2 As B ON A.RecID = B.RecID_FK 
      and A.Desc like '% ' + B.Word + ' %' 
    end