0

我在同一件事上尝试了两种不同的变体。第一个版本从 中选择freetexttable,其他插入到临时表中并从中进行选择。我在第一个版本上尝试了许多变体(在两个范围级别选择几个组合,分组依据,不同,并将 [rank] 强制转换为整数。无论如何,第一个查询始终返回 3 行,每行都有值137,而第二个查询始终返回 1 行,其值为137

这里发生了什么?为什么自由文本返回重复项,为什么不使用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
4

3 回答 3

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 行受影响)

于 2011-09-06T10:49:09.187 回答
0

我猜你将排名转换为整数,它实际上是一个浮点数?如果是这样,那么我的下一个猜测是它归结为典型的浮点比较问题。

关于您的临时表,您正在做的是选择所有重复的数据,将其逐字放入临时表中,然后将其转储出来,重复和所有。这可能会取得更大的成功

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
于 2009-11-04T20:17:20.507 回答
0

如果您独立运行第一个查询中的子查询,它会返回什么?运行SELECT * FROM (SELECT DISTINCT ...)有点奇怪(尽管它当然应该返回与内部查询完全相同的东西)。

于 2009-11-04T20:40:56.423 回答