0

同じもので 2 つの異なるバリエーションを試しました。最初のバージョンはから選択しfreetexttable、他のインセットは一時テーブルに挿入し、そこから選択します。最初のバージョンでさまざまなバリエーションを試しました (スコープの両方のレベルで、group by、distinct、[rank] を整数にキャストするいくつかの組み合わせを選択します。それにもかかわらず、最初のクエリは一貫してそれぞれが値を持つ 3 行を返します137が、 2 番目のクエリは、 の値を持つ 1 行を一貫して返します137

ここで何が起こっているのですか?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
4

3 に答える 3

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

良い謎を無視することはできませんが、この場合、この動作を再現できませんでした. その freetexttable と関係があるか、問題を示さない別のバージョンのクエリを投稿した可能性があります。の結果を見ることができればよかったのに:

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

テストを可能にするために freetexttable をサブクエリに置き換えると、サブクエリにはあなたが言ったように 3 つあるにもかかわらず、両方のケースで 1 つの行が得られます。

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

スタンドアロンで実行した場合、最初のクエリのサブクエリは何を返しますか? 実行SELECT * FROM (SELECT DISTINCT ...)は少し奇妙です (もちろん、内部クエリとまったく同じものを返す必要があります)。

于 2009-11-04T20:40:56.423 に答える