2014-12-25 7 views
1

에 대한 검색을 좋아하지. 이 두 테이블은 다음과 같은 데이터를 중간 테이블 통화 ItemModels를 통해 연결되어 있습니다 :내가 ID 및 텍스트 열이있는 모델 테이블이 링크 표

ID | ItemID  | ModelID 
================================== 
1  |  1  |  1 
2  |  1  |  2 
3  |  2  |  1 
4  |  2  |  2 
5  |  2  |  3 
6  |  3  |  2 

내가 표준 사용하여 검색 할 "비 포함, 포함을 가진이 시작, 함께 종료"방법.

LIKE 연산자를 사용하여 "포함", "함께 시작"또는 "끝냄"검색을 수행하면 정상적으로 작동하지만 항상 올바른 결과를 얻지 만 NOT LIKE 연산자를 사용할 때 문제가 발생합니다.

나는 모델 설명을 단순히 일을 생각 "C"(대소 문자 구분)를 포함하지 않는 모든 항목을 반환하려면 다음

SELECT ItemID FROM ItemModels INNER JOIN Model ON ItemModels.ModelID = Model.ID WHERE Description NOT LIKE '%C%' 

내가이 쿼리로 항목 1과 3을 반환하려면 두 모델 모두 'C'를 포함하는 모델을 가지고 있지 않지만이 쿼리는 ItemModel.ID = 3으로 레코드를 히트하고 "계속하지 않습니다. 아인 C 그래서 우리는 그것을 돌려주고 싶다! " 물론 이는 바람직하지 않은 행동입니다.

그래서 제 질문은 :

은이 링크 테이블의 모든 레코드를 포함 검색을 좋아하지 어떻게 할 수 있습니까?

ps. 나는이 문제를 추적하고 왜 그것이 일어나고 있는지를 생각해 내는데 몇 시간이 걸렸으므로 이것을 분명히하기를 희망한다. 그리고 그것을 고치는 방법을 해결하려고 노력하는 더 많은 시간!

답변

2

의 상품도 조건에 해당하지 않는 상품입니다. 통합의 측면과 having 절에 생각 :

SELECT im.ItemID 
FROM im.ItemModels im INNER JOIN 
    Model m 
    ON im.ModelID = m.ID 
GROUP BY im.ItemId 
HAVING SUM(CASE WHEN Description LIKE '%C%' THEN 1 ELSE 0 END) = 0; 

이 쿼리는 항목과 일치 모델의 수를 계산합니다. = 0은 아무 것도 없다고 말합니다. 나는 매우 유연하기 때문에이 접근법을 좋아합니다. ANDOR을 사용하면 '% a %'와 '% b %'와 같은 복잡한 조건을 조합 할 수 있지만 '% c %'와는 다릅니다.

+0

"THEN 1 ELSE 0"을 "THEN 0 ELSE 1"로 바꿀 때까지이 작업이 이루어지지 않았습니다. 덕분에 그 전에는 크리스마스 기간과 모든 항목을 시험해 볼 기회가 없었습니다. –

+0

@StevenWood. . . 대신에,'LIKE' 전에'NOT'을 제거했습니다. NULL 값이 있다면 꽤 동등하지는 않지만, 역시 작동 할 것이라고 생각합니다. –