2009-11-04 5 views
0

J'ai essayé deux variations différentes sur la même chose. La première version sélectionne de freetexttable, les autres insère dans une table temporaire et sélectionne à partir de cela. J'ai essayé de nombreuses variantes sur la première version (sélectionnez plusieurs combinaisons, aux deux niveaux de portée, de group by, distinct, et cast [rang] à un entier.) Quoiqu'il en soit, la première requête renvoie systématiquement 3 lignes ayant chacune la valeur 137 alors que la deuxième requête renvoie toujours 1 rang ayant une valeur de 137Pourquoi Select est-il distinct de la fonction retournant des doublons?

Qu'est-ce qui se passe ici Pourquoi est-ce FreeText les doublons de retour et pourquoi sont-ils pas éliminés avec select distinct ou group by

note:.? Je veux savoir pourquoi, pas comment y remédier J'ai déjà des solutions de contournement acceptables

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 

Répondre

0

Je devinerais que le résultat est un nombre entier qui est en fait un flottant? Si oui, alors ma prochaine supposition serait que cela se résume à des problèmes de comparaison à virgule flottante typiques.

En ce qui concerne votre table temporaire, ce que vous faites est de sélectionner toutes les données en double, en les mettant dans la table temporaire verbatim, puis en les vidant, en les dupliquant et tout. Cela pourrait avoir plus de succès

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

Non, la version de table temp ne ne pas avoir les doublons. Et je pensais que c'était peut-être un flotteur, mais en fait j'essayais juste des trucs au hasard pour essayer de comprendre. Si les problèmes à virgule flottante étaient le problème (ce dont je doute), le lancer dans le select interne et ensuite sélectionner distinct dans le select externe l'aurait corrigé. – Brian

0

Qu'est-ce que la sous-requête dans la première requête renvoie, si vous l'exécutez autonome? Courir SELECT * FROM (SELECT DISTINCT ...) est un peu étrange (bien qu'il devrait bien sûr retourner exactement la même chose que la requête interne).

+0

Il retourne exactement la même chose (3 instances de 137). – Brian

+0

La raison pour laquelle je lance Select * depuis (Select distinct ...), c'est parce que j'ai essayé plusieurs permutations distinctes de groupes distincts et de groupes dans l'espoir d'avoir de la chance et de le faire fonctionner (ce qui me donnerait plus d'informations cherchant la compréhension). – Brian

+0

C'est une énigme, alors ... Je n'ai vraiment aucune idée de ce qui pourrait arriver, désolé. –

0

Je ne peux jamais ignorer un bon mystère, mais dans ce cas, je ne pouvais pas reproduire ce comportement. Soit c'est quelque chose à faire avec ce freetexttable ou peut-être que vous avez posté une version différente de la requête qui ne présente pas le problème. Il aurait été bien si nous pouvions regarder le résultat de:

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

Le remplacement de votre FREETEXTTABLE avec une sous-requête pour permettre de tester, je reçois une ligne dans les deux cas, même si la sous-requête a trois comme vous avez dit:

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 

rang


(1 ligne (s) affectée)

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 row (s) affected)

rang


(1 row (s) affected)

+0

Malheureusement, je ne sais pas quel code j'ai eu à l'origine de ce problème; J'ai passé 15 minutes à chercher et je ne l'ai pas trouvé (ou même aucune instance de "freetexttable") dans la base de données. Je pense qu'à un moment donné, la fonctionnalité que cela était censé soutenir a été abandonnée. Pardon. – Brian

Questions connexes