2013-04-01 2 views
1

나쁜 게시 제목 죄송하지만이 요약 할 수 없습니다.전체 열 텍스트 검색

예를 사용하는 것이 좋습니다. 두 개의 텍스트 열이있는이 간단한 테이블이 있다고 가정 해 봅시다. 다른 열은 그대로 두겠습니다.

Id Text_1 Text_2 
1  a  a b 
2  c  a b 

이제 "a"가 아닌 "b"를 검색하려면 현재 구현에서 레코드 1을 다시 얻고 있습니다. 이유는 이해합니다. 검색 조건이 "Text_1"열과 일치하기 때문입니다. 반면 레코드 2의 경우 모든 열에 일치하지 않습니다.

그러나 최종 사용자의 경우 대부분의 경우뿐만 아니라 레코드 1을 제외한다는 의미이므로 직관적이지 않을 수 있습니다.

내 질문은 SQL Server에 "모든 열에 걸쳐"("NOT"부분이 ANY 열에 있으면 레코드가 일치하지 않아야 함을 의미하는) 일치를 수행하도록 지정하려는 경우입니다. 가능한?

편집 : 이것은 나의 질의는 예를 들어 같이 할 것입니다 :

SELECT Id, TextHits.RANK Rank, Text_1, Text_2 FROM simple_table 
JOIN CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a" and not "b"') TextHits 
ON TextHits.[KEY] = simple_table.Id 
ORDER BY Rank DESC 

실제 쿼리 (더 많은 열, 더 조인 등) 조금 더 복잡하지만, 이것은 일반적인 생각입니다 :)

감사합니다.

+2

@xurumunga. . . 당신이 옳은 일을한다고 생각하지 않는 현재 사용하고있는 코드의 예를 들어 줄 수 있습니까? 또한 데이터베이스를 태그로 포함시키는 것은 중요합니다. 왜냐하면 서로 다른 데이터베이스는 텍스트 검색의 장점이 서로 다르기 때문입니다. –

+0

@Gordon에게 제안 해 주셔서 감사합니다. 쿼리와 태그를 추가했습니다. – xurumanga

+0

거기에 백만 가지의 서로 다른 예제가 있고 이것은 복제본의 중복입니다 : http://stackoverflow.com/questions/1796506/search-all-tables-all-columns-for-a-specific-value-sql- 서버 – RandomUs1r

답변

1

로직은 각 레코드에 대해 평가됩니다. 행의 한 레코드에서 제외 된 히트를 원할 경우 행에 제외를 발생 시키려면 NOT EXISTS을 사용해야하며 전체 텍스트 쿼리를 별도의 포함 및 배제로 분리해야합니다 부품 ...

SELECT Id, 
     TextHits.RANK Rank, 
     Text_1, 
     Text_2 
FROM simple_table 
JOIN CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a"') TextHits 
     ON TextHits.[KEY] = simple_table.Id 
WHERE NOT EXISTS (SELECT 1 
        FROM CONTAINSTABLE(simple_table, (Text_1, Text_2), '"b"') exclHits 
        WHERE TextHits.[KEY] = exclHits.[KEY]) 
ORDER BY Rank DESC 
+0

Thanks @ Love2Learn. RandomUs1r도 제안한 것처럼, 제외 할 게시물 단계를 수행하면 내가해야 할 일인 것 같습니다. 나는 내가 ""a "가 아닌"b "를 지원해야하고, 나의 쿼리를 지나치게 복잡하게 만들고 싶지 않기 때문에 그것을 생각해야 할 것이다. 나는 그것이 비록 일할 것이기를 바라고있다. 나는 그것을 시도 할 기회를 얻었을 때 다시 게시 할 것이다. – xurumanga

+0

이 방법이 트릭을 만들었습니다. 우리는 약간 다른 것으로 끝났지 만 거의 똑같습니다. 존재하지 않는 곳을 수행하는 대신에 우리는 어디에도 있지 않습니다 (SELECT exclHits. [KEY] CONTAINSTABLE (...)). 건배 모두 : – xurumanga

+0

쿼리 계획 관점에서 '존재하지 않음'을 수행하고'TextHits. [KEY] = exclHits. [KEY]'를 'WHERE simple_table'로 변경할 수 있습니다.Id = exclHits. [KEY]'이지만 쿼리 플랜 관점에서 보면 같은 것이어야합니다. 다행 이네. –