두 테이블이 있습니다.해당 테이블의 전체 열에서 키워드 검색
그리고 하나 더사용자 테이블
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는 고객 지원 표에 없습니다.
두 테이블이 있습니다.해당 테이블의 전체 열에서 키워드 검색
그리고 하나 더사용자 테이블
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는 고객 지원 표에 없습니다.
을 수행해야합니다는 고객 지원 테이블에없는 유일한 하나로서
;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
를 반환합니다.
이 질문은 현재 데이터 모델로 대답 할 수 있지만 복잡하고 많은 시간 낭비입니다.
그러나 현명한 데이터 모델을 사용하면 매우 간단한 질문이므로이 모델을 사용하여 답변 해 드리겠습니다.
우리 고객 지원 테이블에서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;
귀하의 질문은 아주 좋은 예입니다 데이터 모델을 망치기 전에 생각하는 것이 왜 가치가있는가. 귀하의 데이터 모델은 간단하면 인 경우 인 경우 매우 유용합니다. 값을 분할 재귀 공통 테이블 식을 사용
는
왜 왜 여러 값을 한 열에 저장합니까? – jpw
데이터베이스 정규화를 시작하고 모든 필드에서 쉼표로 구분 된 값을 없애는 것이 좋습니다. 귀하의 질문은 대답하기가 매우 쉽습니다. – oerkelens
@jpw : 답장을 보내 주셔서 감사합니다. 이것은 오래된 DB입니다 ..이 테이블에는 이미 수백만 개의 레코드가 있습니다. 이제 테이블 구조를 변경할 수 없습니다. : ( –