老实说,我没有意识到SQLServer包含函数的全部功能。我不确定它是否符合我的需要,但我肯定会研究它;它隐式地为每一行分配一个NEWID,由于NEWID是均匀分布的,这将在子查询中为您提供N行的随机(伪随机)集。我从随机性的角度担心这个“选项(快速5)”

老实说,我没有意识到SQLServer包含函数的全部功能。我不确定它是否符合我的需要,但我肯定会研究它;它隐式地为每一行分配一个NEWID,由于NEWID是均匀分布的,这将在子查询中为您提供N行的随机(伪随机)集。我从随机性的角度担心这个“选项(快速5)”,sql,sql-server,performance,random,query-performance,Sql,Sql Server,Performance,Random,Query Performance,老实说,我没有意识到SQLServer包含函数的全部功能。我不确定它是否符合我的需要,但我肯定会研究它;它隐式地为每一行分配一个NEWID,由于NEWID是均匀分布的,这将在子查询中为您提供N行的随机(伪随机)集。我从随机性的角度担心这个“选项(快速5)”;在我看来,允许SQL Server选择一种方便的排序方式可以避免NEWID()所提供的伪随机排序。这是一种有效的解决方案,但我正在寻找真正随机的排序方式。虽然我意识到这可能会影响性能,但我必须承认我对SQL Server没有经验,也不太熟悉您


老实说,我没有意识到SQLServer包含函数的全部功能。我不确定它是否符合我的需要,但我肯定会研究它;它隐式地为每一行分配一个NEWID,由于NEWID是均匀分布的,这将在子查询中为您提供N行的随机(伪随机)集。我从随机性的角度担心这个“选项(快速5)”;在我看来,允许SQL Server选择一种方便的排序方式可以避免NEWID()所提供的伪随机排序。这是一种有效的解决方案,但我正在寻找真正随机的排序方式。虽然我意识到这可能会影响性能,但我必须承认我对SQL Server没有经验,也不太熟悉您提出解决方案的方式。为什么第二个select语句也选择名称?第二个select查询提供了要插入到
@results
中的新行。它必须与插入列表匹配。在我的示例中,插入列表是
(name)
,因此查询只选择
name
SELECT DISTINCT TOP 5 lower(Words.TOKEN) as LTOKEN, Words.LEMMA, TagSet.POS_Simplified, TagSet.TAG 
FROM Words JOIN TagSet on Words.TAG = TagSet.TAG 
WHERE NOT Words.LEMMA = 'monarchie' AND TagSet.POS_Simplified = 'noun' 
AND TagSet.TAG = 'NOM' AND NOT Words.TOKEN = 'monarchie'
AND [dbo].edit_distance('monarchie', Words.Token) > 0.5
Select top 5 * from (
SELECT DISTINCT lower(Words.TOKEN) as LTOKEN, Words.LEMMA, TagSet.POS_Simplified, TagSet.TAG 
FROM Words JOIN TagSet on Words.TAG = TagSet.TAG 
WHERE NOT Words.LEMMA = 'monarchie' AND TagSet.POS_Simplified = 'noun' 
AND TagSet.TAG = 'NOM' AND NOT Words.TOKEN = 'monarchie'
AND [dbo].clrEditDistance('monarchie', Words.Token) > 0.5
) AS T
ORDER BY NEWID()
OPTION(fast 5)
select top 5 * from
(
SELECT DISTINCT TOP 1000 lower(Words.TOKEN) as LTOKEN, Words.LEMMA, TagSet.POS_Simplified, TagSet.TAG 
FROM Words JOIN TagSet on Words.TAG = TagSet.TAG 
WHERE NOT Words.LEMMA = 'monarchie' AND TagSet.POS_Simplified = 'noun' 
AND TagSet.TAG = 'NOM' AND NOT Words.TOKEN = 'monarchie'
AND [dbo].edit_distance('monarchie', Words.Token) > 0.5
) order by newid();
declare @results table (id bigint, name varchar(100))

while (select count(*) from @results) < 5
    begin
    insert  @results
            (name)
    select  name
    from    (
            select  top 100 *
            from    dbo.Words
            order by
                    newid()
            ) as SubQueryAlias          
    where   dbo.edit_distance(left(name,4), 'APRS', 100) < 3
    end  

select  top 5 *
from    @results
declare @results table (id bigint, name varchar(100))

while (select count(*) from @results) < 5
    begin
    insert  @results
            (name)
    select  name
    from    (
            select  *
            from    dbo.Words
            WHERE  IDCOLUMN = CONVERT(INT,RAND()) * APPX_NUMBER_OF_ROWS
            ) as SubQueryAlias          
    where   dbo.edit_distance(left(name,4), 'APRS', 100) < 3
    end  

select  *
from    @results)