2009-08-18 6 views
2

SQL Server 전체 텍스트 검색에서 CONTAINSTABLE 및 NOT 키워드를 사용하고 단일 열에 제외 할 값이 포함 된 행을 제외 할 수 있습니까?전체 텍스트 검색 및 여러 열과 함께 NOT 키워드 사용

예를 들어, (이 문제를 설명하기 위해 간략화) 다음 인덱싱 된 뷰를 보자

ItemId INT 
FirstName VARCHAR(200) 
MiddleName VARCHAR(200) 
LastName VARCHAR(200) 
Address VARCHAR(1000) 
ChildrenNames TEXT 
SearchData TEXT 

SearchData 다른 텍스트/VARCHAR 필드에서 발생하는 연결 필드이다.

이보기는 FIRSTNAME 포함 된 행을 찾으려면 다음 쿼리를 사용하여 검색 할 수 있지만 LASTNAME

: 그것은 바와 같이

SELECT * 
FROM [v_MyView] V 
     LEFT OUTER JOIN CONTAINSTABLE 
     (
      [v_MyView], 
      (
      [FirstName], 
      [MiddleName], 
      [LastName], 
      [Address], 
      [ChildrenName], 
      [SearchData] 
     ), '"name" AND NOT "lastname"') FTS ON [FTS].[Key] = [V].[ItemId] 
WHERE (ISNULL(RANK,0) > 0) 

이 쿼리는 올바른 결과를 반환하지 않는 것 검색 대상 필드 중 ALL이 기준을 충족하는 경우 행만 제외하고 반면에 기준을 충족하는 행은 ANY 행을 제외해야합니다.

즉. 이름 AND 임의 (단일) 열에 LASTNAME 포함 된 행이 아니라 이름 될 예정 모든 열의 LASTNAME를 (포함 행만보다 결과 집합에서 제외되어야 있을 것 같지 않게).

사용할 수있는 유일한 옵션은 사용자 쿼리에 exclude 값 (예 : name -lastname)이 포함되어 있는지 확인하는 것입니다. 그렇다면 'SearchData'열만 검색하면 쿼리가 연결된 열이므로 검색을 제한하십시오. 모든 데이터가 포함됩니다. 그러나 이는 관련성 순위에 영향을 미치며 좋은 해결책으로 보이지 않습니다.

답변

2

나는이 문제가 SQL 서버의 버그라고 생각합니다.

누군가가 깜빡 한 것 같습니다 (A & B & C) ===! A | ! B | ! C

지금은 검색하려는 모든 행의 연결을 저장하는 새 열을 만들고, 데이터가 삽입되거나 업데이트 될 때 모든 텍스트를 추가하기위한 트리거를 추가하고 그만 검색하면됩니다. 하나의 새로운 컬럼.

이 표는 표를 정상화하지만 합리적으로 잘 수행되는 것으로 보입니다.