2014-02-18 4 views
0

http://sqlfiddle.com/#!6/5ac78/1SQL : CHARINDEX를 사용하여 첫 번째 경기뿐만 아니라 최선의 경기를 반환 할 수 있습니까?

피들이 작동하는지 확실하지 않습니다. CHARINDEX에서 조인 코드 2를 반환하고 싶습니다. 다음과 같은 항목이

ID  Description       Code 
158  INTEREST       199 
159  INTEREST PAID      383 
160  INTEREST PAYABLE ON  ACCOUNT  384 

그리고 마스터 테이블 (산) :

는 또 다른 예로서,이처럼 보이는 설명 테이블 (DT)가

ID  Narrative      Code 
1  INTEREST PAID     NULL 

내가 필요 마스터 테이블의 코드를 383으로 설정합니다. CHARINDEX (dt.Description, mt.Description)> 0을 사용하여 JOIN을 기반으로 INSERT 할 때마다 mt.Code가 199로 설정됩니다.

과 일치하는 설명 테이블에서 코드를 가져 오도록 마스터 테이블을 업데이트하는 방법은 무엇입니까?

감사합니다.

답변

1

LEFT JOIN과 일치하는 항목을 찾으려면 간단한 JOIN을 사용하면 가장 긴 항목을 제외한 모든 항목을 제거 할 수 있습니다.

UPDATE t1 
SET t1.codeA = t2_1.codeB 
FROM table1 t1 
JOIN table2 t2_1  
    ON CHARINDEX(t2_1.colB, t1.colA) > 0 
LEFT JOIN table2 t2_2 
    ON CHARINDEX(t2_2.colB, t1.colA) > 0 
AND t2_1.codeB <> t2_2.codeB 
AND LEN(t2_2.colB) > LEN(t2_1.colB) 
WHERE t2_2.colB IS NULL; 

An SQLfiddle to test with.

CHARINDEX과 같은 쿼리 (또는 원래 쿼리)에서 인덱스를 사용하는 것은 불가능하므로 대용량 데이터의 경우 쿼리가 매우 느릴 수 있습니다. 원래 문제가 있음을

또한

, 항상 내가 당신의 바이올린 예에 기술적 인 문제를 해결하는 동안, 당신의 생산 데이터 : 반사에

+0

완벽한! 내가 뭘 던져도 상관 없다 ... 정말 고마워! –

1

이 어색하지만, 그것은 작동하는 것 같다 :

update table1 
    set codeA = (
     select max(codeB) 
     from table2 
     where charindex(colB, colA) > 0 
    ) 
where exists ( 
    select 1 
    from table2 
    where charindex(colB, colA) > 0 
); 

개정 바이올린은 여기에 있습니다 : http://sqlfiddle.com/#!6/5ac78/12

문제는 반환 할 "최고"값 인 아는 것입니다. 최대 ID를 가진 행이 원하는 것으로 가정했습니다.

+1

에 인터넷에서 무작위로 사람들 SQL 업데이트를 실행하기 전에 먼저 테스트, 그것은 나에게 발생 약간 다를 수 있습니다. 텍스트 또는 부분 텍스트를 다른 텍스트 필드와 일치 시키려고합니다. 그건 미친 짓이며, SQL에서 인코딩하기에 간결한 "최상의"일치 알고리즘을 명확하게 지정하는 것은 거의 불가능합니다. – Turophile

+0

'가장 좋은'값은 가장 가까운 값과 일치하는 값입니다. 필자의 경우, INTEREST PAID는 INTEREST보다는 최상의 (그리고 정확히 일치하는) 것이다. 필자의 설명 테이블에 ("I am", 1) 및 ("I", 2)에 대한 항목이 포함되어 있으면 table1은 codeA의 첫 번째 행에 대해 값 1을 가져야합니다. –