2009-12-08 2 views
0

SQL Server 2008을 실행하고 있으며 일부 저장되지 않은 데이터에 대해 쿼리를 실행하려고합니다. 처리하지 않고 정리하려고합니다 (수백만 행 처리). 와). 내가 가지고있는 로그 테이블은 하나의 테이블에 쉼표로 구분 된 문자열로 된 일부 FK 데이터와 다른 테이블에있는 정수 PK입니다. 기본 테이블의 적절한 PK ints에 정수의 FK 목록에 참여할 수 있기를 바랍니다. 내 쿼리가이 같은 것입니다 : D.ID는 정수 기본 키 동안INT 열을 쉼표로 구분 된 INT 목록에 결합합니다.

SELECT 
    L.* 
FROM MyLogs L (NOLOCK) 
    INNER JOIN Details D (NOLOCK) ON L.SearchValue = D.ID 

위의 쿼리에서, L.SearchValue는 "123,456,7890"를 포함하고 있습니다. 어떤 종류의 효율적인 방식으로 이들을 결합 할 수있는 방법이 있습니까? 아니면 그냥 내 운명을 받아 스크립트로 작업하여 이러한 모든 쉼표로 구분 된 값을 별도의 행으로 나누어야합니까?

+0

모든 해답을 주셔서 감사합니다. 예상했던대로 정확하게 맞습니다 (인정하기 싫지만). 나는 그 대본을 정리하고 나서 내 손가락을 교차시킬거야. 아마도 Stu가 제안한 스크립트를 사용하여 변환을 수행하게 될 것입니다. 행운을 빌어 요. –

답변

0

아주 아주 아주 나쁜 디자인은, 이것은 매우 가난 perfomance 수 있지만, (312)는 CHARINDEX 기능

Select L.*FROM MyLogs L (NOLOCK)  
    Join Details D (NOLOCK) 
     On CharIndex(Cast(D.ID as varChar(6)), L.SearchValue) > 0 

을 사용할 수 있습니다 그리고이 일부 허위가 12로는 '34에있을 것입니다 조인 prodcude 것, 455 ' . 이들을 제거하기 위해 당신이

Select L.*FROM MyLogs L (NOLOCK)  
    Join Details D (NOLOCK) 
     On CharIndex(Cast(', ' + D.ID as varChar(6)) + ',', 
          ', ' + L.SearchValue + ',') > 0 

구분 기호를 포함하여 쿼리가 더욱 복잡하게 할 필요가 조인 ...하지만 난 당신이 별도의 행에 값을 쉼표로 구분 된이 모든 것을 파괴하는 스크립트 작업을 시작하는 것이 좋습니다 것입니다.

+0

별로. D.ID가 1이고 L.SearchValue가 "34199"라고하던가요? – Stu

+0

@Stu, 당신은 편집 사이에 저를 잡았습니다 ... –

0

이 끔찍하게 저장된 데이터를 해독하기위한 스크립트는 궁극적으로 이러한 값을 조인하려는 해킹 SQL 쿼리를 작성하는 것보다 훨씬 효율적입니다. 나는 조인이 갈 길이라고 확신하지 못합니다. 아마 하위 쿼리 어떤 형태의 당신은 이들 중 하나를 필요로

0

이 시도 :

SELECT L.* 
FROM MyLogs L (NOLOCK) 
    INNER JOIN Details D (NOLOCK) ON CONTAINS(',' + L.SearchValue + ',', ',' + Convert(varchar,D.ID) + ',') 

그것은 끔찍 ineffecient 수 있지만 다니엘스는 달리 SearchValue가 (123,234,345)를 포함 말할 수 있다면 휴식 실 거예요 응답하고 D.ID 23 (2 행에 대해 사실이 될 것이다)

쉼표를 추가하여 수정했습니다.

관련 문제