2015-01-13 4 views
0

두 테이블 tmpModels 및 tmp_product가 있습니다. tmpModel의 모델을 기반으로 일치하는 모델을 찾아야합니다. 예를 들어, tmpmodel.updatedmodel ='amb3771'tmp_product.updatedmodel'amb3771bian' or '123abc3771xv' 일 수있는 경우 일치 항목이 있습니다. tmp_product.updatedmodel이 updatedmodel 열의 모든 위치에서 tmpmodel과 일치하는 패턴을 포함해야한다는 것을 의미합니다.패턴을 기반으로 한 SQL 결합

실제로 저장 프로 시저를 만들었지 만 여기에는 하나의 특정 값에 대한 동작을 확인하는 스 니펫이 있습니다.

declare @model1 nvarchar(255) 
set @model1 = 'amb3771' 

select g.updatedmodel as GFK,p.updatedmodel Product from dbo.tmpModels g 
join dbo.tmp_product p 
on g.updatedmodel= substring(p.updatedmodel,PATINDEX('%@model1%',p.updatedmodel),LEN(@model1)) 

select @model1 

결과에 2 개의 행만 표시 될 것으로 예상됩니다. 왜 다른 값이 @model1에 할당되는 지 이해할 수 없지만 'amb3771'에 강제로 설정하고 이상하게도 'amb3771'과 일치하는 결과가 없습니다 !! 이 논리가 작동하지 않는 이유를 이해하고 원하는 결과를 얻도록 도와주십시오. DLeh가 @model이 따옴표로 안 언급 한 바와 같이 모든

GFK Product 
w679 w679 
t754cw t754cw 
wa5714 wa5714silber 
fl2823 fl2823 
dc7230 dc7230 
wda100 wda100 
wa74sd wa74sd 
ev9547 ev9547 
wa5714 wa5714weiss 
wa7439 wa7439 
wda210 wda210wpm 
wda210 wda210wpm 
w194 w194 
wda110 wda110wcs 
wa5714 wa5714silber 
wda100 wda100 
+0

'PATINDEX ('% @의 모델 1 %의' '-의'에 싸여'@의 model1'는 – DLeh

+0

이유 헉 당신이, 당신을 보여 쿼리하십시오. tmpModels의 전체 테이블 스캔을 수행하고 있습니다. 그런 다음 해당 테이블의 모든 행에 대해 tmp_product의 전체 테이블 스캔을 수행하고 있습니다. 예상되는 2 행 결과에 대해 엄청난 양의 테이블 스캔이 될 수 있습니다. tmpModels 행을 사용하면 결합 기준을 sargable로 만들 수있는 방법이 없습니다. 가장 좋은 장기 전략은 'amb3771'과 'xxxamb3771xxx'사이의 간단한 커넥터를 만드는 것입니다. 이미 존재하지 않는 것이 있다면 그것을 만들어라. – TommCatt

+0

@ DLeh, 고마워! 따옴표. 그것을 붙잡고 계속 그에게 논리에 대해서만 염려했다. – SKa

답변

1

첫째 - 아래는 결과입니다. 아래 쿼리를 실행하면 내가 그것을 강요하고있다하더라도

내가 다른 값이 @ 모델 1 에 할당되는 이유를 이해하지 않습니다

어떤 다른 값이 @model

에 할당되지 PATINDEX가 0을 반환하고 부분 문자열이 0 번째 인덱스에서 길이로 p.UpdateModel의 전체 값을 얻는 것을 볼 수 있습니다

select g.updatedmodel as GFK,p.updatedmodel Product, PATINDEX(@model1,p.updatedmodel) 
from dbo.tmpModels g 
join dbo.tmp_product p 
on g.updatedmodel= substring(p.updatedmodel,PATINDEX(@model1,p.updatedmodel),LEN(@model1)) 
내가 제안 할 수 있습니다

하나 개의 솔루션 대신 내가 tmpModel 및 tmp_Product의 값을 표시한다 모델을 가정하고 JOIN

set @model1 = '%wa5714%' 

    select DISTINCT g.updatedmodel as GFK,p.updatedmodel Product 
    from dbo.tmpModels g 
    , dbo.tmp_product p 
    WHERE PATINDEX(@model1,p.updatedmodel) > 0 
    AND PATINDEX(@model1,g.updatedmodel) > 0 

WHERE 조건을 사용하는 것입니다.

당신은이/예 자세한 내용을 서로 다른 요구 사항을 제공 한 경우

+0

큰 감사. 이것은 필자가 쓴 SQL 문장의 동작을 이해하는데 도움이되었다. 나는 주로 원하는 결과를 얻기 위해 솔루션을 사용했습니다. 그러나 나는 잘못된 결과를 주었던 다른 스 니펫을 저장했으며 여기서 다시이 SQL 문에 대해 토론 할 것입니다. 당분간, 당신은 나의 날을 구했습니다. – SKa

관련 문제