2014-09-17 4 views
1

두 테이블이 있습니다.해당 테이블의 전체 열에서 키워드 검색

사용자 테이블

UserId Username 
1   User1 
2   User2 
3   User3 
4   User4 
17   User17 
18   User18 
20   User20 

그리고 하나 더

고객 지원 테이블

CSid Userslist 
1  1,3 
2  2 
3  20,17,18 

어떻게 사용자 탭의 사용자 ID를 얻을 수 있습니다 le는 고객 지원 표에 없습니다.

+0

왜 왜 여러 값을 한 열에 저장합니까? – jpw

+1

데이터베이스 정규화를 시작하고 모든 필드에서 쉼표로 구분 된 값을 없애는 것이 좋습니다. 귀하의 질문은 대답하기가 매우 쉽습니다. – oerkelens

+0

@jpw : 답장을 보내 주셔서 감사합니다. 이것은 오래된 DB입니다 ..이 테이블에는 이미 수백만 개의 레코드가 있습니다. 이제 테이블 구조를 변경할 수 없습니다. : ( –

답변

3

을 수행해야합니다는 고객 지원 테이블에없는 유일한 하나로서

;WITH Split AS 
(
    SELECT 
      LEFT(Userslist,CHARINDEX(',',Userslist)-1) AS Userslist 
      ,RIGHT(Userslist,LEN(Userslist)-CHARINDEX(',',Userslist)) AS Remainder 
     FROM CustomerSupport 
     WHERE Userslist IS NOT NULL AND CHARINDEX(',',Userslist)>0 
    UNION ALL 
    SELECT 
     Userslist AS Userslist, NULL AS Remainder 
    FROM CustomerSupport 
    WHERE Userslist IS NOT NULL AND CHARINDEX(',',Userslist)=0 
    UNION ALL 
    SELECT 
     LEFT(Remainder,CHARINDEX(',',Remainder)-1) 
     ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(',',Remainder)) 
    FROM Split 
    WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)>0 
    UNION ALL 
    SELECT 
     Remainder,null 
    FROM Split 
    WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)=0 
) 

SELECT * FROM Users 
WHERE UserId NOT IN (
SELECT Userslist FROM Split) 

쿼리는 샘플 데이터에 대한 User4를 반환합니다.

Sample SQL Fiddle

나는 KM에 의해 this answer에서 내 대답을 적응. 그것을받을 자격이있는 사람에게 공로를 인정하십시오.

+0

고맙습니다. .. !! –

+0

대답이 어떻게 가장 크고 복잡한 부분이 데이터 모델의 길들이기를 다루는 지 그리고 마지막에 작고 간단하고 빠른 쿼리가 실제로 정리 된 것에서 원하는 답변을 얻는 방법을 보여주는 것이 흥미 롭습니다. 엉망 : – oerkelens

+0

@oerkelens 결함이있는 모델을 다루는 것은 복잡한 부분이지만 때로는 우리가 처리 한 카드를 가지고 놀아야 만한다는 것도 동의합니다.) – jpw

3

이 질문은 현재 데이터 모델로 대답 할 수 있지만 복잡하고 많은 시간 낭비입니다.

그러나 현명한 데이터 모델을 사용하면 매우 간단한 질문이므로이 모델을 사용하여 답변 해 드리겠습니다.

우리 고객 지원 테이블에서UsersList 필드를 제거하십시오. 결코 거기에 있어서는 안됩니다. 아니요, 실제로는 이 아닙니다. 귀하의 예제 데이터 쇼 등이 가정 지금

,,, 모든 사용자가 하나를 CSID을 가질 수 있습니다, 우리는 귀하의 사용자 테이블에에게 필드 CSid을 추가합니다. 이를 외래 키이라고합니다. 언급 한대로 모든 사용자가 CS 테이블에 링크되어 있지 않으므로이 필드에서 NULL 값을 허용하는지 확인하십시오.

이제 우리는 데이터를 입력 : 지금

사용자 테이블

UserId Username CSid 
1   User1  1 
2   User2  2 
3   User3  1 
4   User4 NULL 
17   User17 3 
18   User18 3 
20   User20 3 

그리고, 귀하의 질문에 대답 :

SELECT * FROM UserTable WHERE CSid IS NULL; 

귀하의 질문은 아주 좋은 예입니다 데이터 모델을 망치기 전에 생각하는 것이 왜 가치가있는가. 귀하의 데이터 모델은 간단하면 인 경우 인 경우 매우 유용합니다. 값을 분할 재귀 공통 테이블 식을 사용

+0

그레이트 OP는 데이터를 정상화해야합니다 . – Edward

+0

_it는 많은 작업, 복잡하고 시간 낭비입니다 _ 나는 동의하지 않습니다. – jpw

+0

답장을 보내 주셔서 감사합니다. 나는 이것을 염두에두고 있습니다 .. !! –

관련 문제