2009-11-04 6 views
0

나는 똑같은 두 가지 변형을 시도했다. 첫 번째 버전은 freetexttable에서 임시 테이블로 다른 인세 트를 선택하고 그 중 하나를 선택합니다. 첫 번째 버전에서 다양한 변형을 시도했습니다 (두 가지 수준의 범위, 그룹 별, 고유 한 및 여러 가지 조합을 정수로 캐스팅합니다.) 첫 번째 쿼리는 값이 각각 137 인 3 개의 행을 일관되게 반환합니다. 두 번째 쿼리는 지속적으로 1 행 137의 값을 갖는 반환Select가 중복을 반환하는 함수와 구별되는 이유는 무엇입니까?

여기 무슨 일 반환 중복 FREETEXT 않고 왜 그들이 select distinct으로 제거 또는 group by

참고로하지 않는 이유 :.? 내가 원하는 왜 그런지 고쳐야하는 것이 아닙니다. 이미 적절한 해결 방법이 있습니다.

select * from 
(
select distinct [rank] from freetexttable(dbo.vw_PPN, allKeywords, N'foo', 100000) 
where [key] = 3781054 
) as CT 

create table #temp ([rank] int) 
insert into #temp 
    select distinct [rank] from freetexttable(dbo.vw_PPN, allKeywords, N'foo', 100000) 
    where [key] = 3781054 
select * from #temp 
drop table #temp 

답변

0

실제로 float 인 정수로 계급을 캐스팅한다는 사실을 생각해보십시오. 그렇다면 내 다음 추측은 일반적인 부동 소수점 비교 문제가 될 것이라고 추측합니다.

임시 테이블에 관해서는 모든 중복 데이터를 선택하고 그대로 임시 테이블에 넣은 다음 그냥 덤프하고 중복 된 데이터를 모두 선택하는 것입니다. 이것은 당신이 실행하면 첫 번째 쿼리의 반환에 하위 쿼리, 그것은 무엇을 독립 않습니다 더 성공

create table #temp ([rank] int) 
insert into #temp 
    select [rank] from freetexttable(dbo.vw_PPN, allKeywords, N'foo', 100000) 
    where [key] = 3781054 
select distinct [rank] from #temp 
drop table #temp 
+0

없음, 임시 테이블 버전 수행 중복이 없습니다. 그리고 아마 순위가 플로트라고 생각했을지 모르지만, 실제로 나는 그것을 알아 내기 위해 무작위로 노력하고있었습니다. 부동 소수점 문제가 문제 였다면 (의심 스럽습니다) 내부 선택 영역에 캐스팅 한 다음 외부 선택 영역에서 고유 부분을 선택하면이 문제가 해결됩니다. – Brian

0

가있을 수 있습니다? SELECT * FROM (SELECT DISTINCT ...)을 실행하는 것은 조금 이상합니다 (당연히 내부 쿼리와 똑같은 것을 반환해야 함).

+0

정확히 똑같은 것을 반환합니다 (137의 인스턴스 3 개). – Brian

+0

Select * from (distinct select ...)를 실행하는 이유는 별개의 여러 순열을 시도했기 때문입니다. 행운을 빌어서 작동하도록하기 위해 캐스팅합니다. 그러면 다음과 같이 사용할 정보가 더 많습니다. 이해를 추구). – Brian

+0

그건 수수께끼인데 ... 무슨 일이 일어날 지 모르겠다. 미안. –

0

좋은 수수께끼를 무시할 수는 없지만,이 경우에는이 동작을 재현 할 수 없습니다. freetexttable과 관련이 있거나 어쩌면 문제가 발생하지 않는 다른 버전의 쿼리를 게시했을 수도 있습니다.

Select * from freetexttable(dbo.vw_PPN, allKeywords, N'foo', 100000) 

테스트 할 수 있도록 하위 쿼리와 함께 FREETEXTTABLE 교체 당신이 말한 세 가지처럼 하위 쿼리에도 불구하고, 나는, 두 경우 모두에서 하나 개의 행을 얻을 : 우리의 결과에서 볼 수 있다면 좋았을 것

Select Distinct [rank] from 
    (select 137 as [rank], 3781054 as [key] union all 
    select 137, 3781054 union all 
    select 137, 3781054) x 
Where [key] = 3781054 

순위


137

(1 행 적용됨)

create table #temp ([rank] int) 
insert into #temp 
    select distinct [rank] from 
     (select 137 as [rank], 3781054 as [key] union all 
     select 137, 3781054 union all 
     select 137, 3781054) x 
    where [key] = 3781054 
select * from #temp 
drop table #temp 

(영향 1 행 (들))

순위


137

(영향 1 행 (들))

+0

불행히도, 나는이 문제를 일으킨 코드를 모른다. 나는 15 분을 보냈고 데이터베이스에서 "freetexttable"의 어떤 인스턴스도 찾지 못했습니다. 어떤 시점에서이 기능이 지원하려고 의도 한 기능이 삭제되었다고 생각합니다. 죄송합니다. – Brian